给出 $n * 1$ 的矩阵,选出 $k$ 个互不重叠的子矩阵,使得其最大
$sum[i]$ 为列的前缀和
设 $f[i][j]$ 表示前 $i$ 个数选出 $j$ 个互不重叠的子矩阵的最大价值
若第 $i$ 个数不属于第 $j$ 个矩阵 $f[i][j] = f[i - 1][j]$
否则枚举第 $j$ 个矩阵的起点 $s$,$f[i][j] = max(f[i][j], f[s - 1][j - 1] + sum[i] - sum[s - 1])$

给出 $n * 2$ 的矩阵,选出 $k$ 个互不重叠的子矩阵,使得其最大
$sum[i][1]$ 为列 $1$ 的前缀和
$sum[i][2]$ 为列 $2$ 的前缀和
$f[i][j][use]$ 表示第 $1$ 列选到的 $i$ 行,第 $2$ 列选到了 $j$ 行,选了 $use$ 个矩阵的最大价值和
考虑枚举 $i, j, use$
第 $i$ 行第 $1$ 列不属于子矩阵或第 $j$ 行第 $2$ 列不属于子矩阵
$f[i][j][use] = std:: max(f[i - 1][j][use], f[i][j - 1][use])$
第 $i$ 行第 $1$ 列和第 $j$ 行第 $2$ 列属于不同的子矩阵
分别枚举第 $i$ 行第 $1$ 列所在子矩阵的起始点和第 $j$ 行第 $2$ 列所在子矩阵的起始点并更新答案,

$f[i][j][use] = max (f[i][j][use], max(f[h-1][j][l-1]+(sum1[i]-sum1[h-1]), 1<=h<=i))$
$f[i][j][use] = max (f[i][j][use], max(f[i][h-1][l-1]+(sum2[j]-sum2[h-1]),1<=h<=j))$

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> #define gc getchar() inline int read() {
int x = , ff = ;
char c = gc;
while(c < '' || c > '') {if(c == '-') ff = -; c = gc;}
while(c >= '' && c <= '') x = x * + c - '', c = gc;
return x * ff;
} const int N = ; int f[N][N][], sum[N][N], n, m, k, A[N][N]; int main() {
n = read(), m = read(), k = read();
for(int i = ; i <= n; i ++) for(int j = ; j <= m; j ++) A[i][j] = read();
if(m == ) {
for(int i = ; i <= n; i ++) sum[i][] = sum[i - ][] + A[i][];
for(int i = ; i <= n; i ++)
for(int j = ; j <= k; j ++) {
f[i][j][] = f[i - ][j][];
for(int s = ; s <= i; s ++) f[i][j][] = std:: max(f[i][j][], f[s - ][j - ][] + sum[i][] - sum[s - ][]);
}
std:: cout << f[n][k][];
} else {
for(int i = ; i <= n; i ++) sum[i][] = sum[i - ][] + A[i][];
for(int i = ; i <= n; i ++) sum[i][] = sum[i - ][] + A[i][];
for(int i = ; i <= n; i ++)
for(int j = ; j <= n; j ++)
for(int use = ; use <= k; use ++) {
f[i][j][use] = std:: max(f[i - ][j][use], f[i][j - ][use]);
for(int s = ; s <= i; s ++) f[i][j][use] = std:: max(f[i][j][use], f[s - ][j][use - ] + (sum[i][] - sum[s - ][]));
for(int s = ; s <= j; s ++) f[i][j][use] = std:: max(f[i][j][use], f[i][s - ][use - ] + (sum[j][] - sum[s - ][]));
if(i == j)
for(int s = ; s <= i; s ++)
f[i][j][use] = std:: max(f[i][j][use], f[s - ][s - ][use - ] + (sum[i][] - sum[s - ][]) + (sum[i][] - sum[s - ][]));
}
std:: cout << f[n][n][k];
}
return ;
}

luogu 2331的更多相关文章

  1. [Luogu 2331] [SCOI2005]最大子矩阵

    [Luogu 2331] [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 ...

  2. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  3. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  4. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  5. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

  6. bzoj 2331: [SCOI2011]地板 插头DP

    2331: [SCOI2011]地板 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 541  Solved: 239[Submit][Status] D ...

  7. Luogu 考前模拟Round. 1

    A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...

  8. luogu P2580 于是他错误的点名开始了

    luogu  P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...

  9. CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

随机推荐

  1. java——数据类型和运算符

    强类型语言 Java语言是一门强类型语言.强类型包含两方面的含义:①所有的变量必须先声明.后使用:②指定类型的变量只能接受类型与之匹配的值.强类型语言可以在编译过程中发现源代码的错误,从而保证程序更加 ...

  2. Centos6 yum安装nginx

    1.Centos6系统库中默认是没有nginx的rpn包的,所以我们需要先更新下rpm依赖库 (1):使用yum安装nginx,安装nginx库 rpm -Uvh http://nginx.org/p ...

  3. Mariadb/Mysql 主从复制(1)

    一.原理 mysql的主从数据同步是一个异步复制过程,需要master开启bin-log日志功能,bin-log记录了master库中的增.删.修改.更新操作的sql语句,整个过程需要开启3个线程,分 ...

  4. hdu 4501三重包问题

    好好理解一下背包问题 从01包入手 内层的循环 是为了以后求解记录数据 因为只有一个取舍问题 所以只需要一层循环就可以 这里有三个背包 钱 积分 以及免费物品 那么 就需要三重循环 #include& ...

  5. android 和 js 交互

    1.html代码 <script type="text/javascript"> function javacalljs(){ document.getElementB ...

  6. C语言数组不知道输入几个整数以及输入一直到为0

    输入一直到为0: ){ } 数组不知道输入几个整数: ],num=; for(;;num++){ scanf("%d",&array[num]); if(getchar() ...

  7. Html5+Mui前端框架,开发记录(三):七牛云 上传图片

    1.Html界面: <div id="container"> <label>凭证:</label> <div id="uploa ...

  8. RAII Theory && auto_ptr

    RAII(Resource Acquisition is Initialization),也称为"资源获取即初始化",是C++语言的一种管理资源,避免泄露的惯用法. C++标准保证 ...

  9. 5.创建执行线程的方式之三 :实现Callable 接口

    Callable 接口 一.Java 5.0 在 java.util.concurrent 提供了 一个新的创建执行线程的方式(之前有继承Thread 和 实现Runnable):Callable 接 ...

  10. C#基础 结构体、枚举

    一 结构体 结构体(struct)指的是一种数据结构,一个变量组,是一个自定义的集合.通常使用结构体创造新的“属性”,封装一些属性来组成新的类型.   结构体一般定义在Mian函数上面,位于Class ...