传送门

题目大意:

从矩阵中取出k个互不重叠的子矩阵,求最大的和。

题目分析:

对于m=1,直接最大m子段和。

对于m=2:

\(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵的答案。

有3中转移:第一列取一段,第二列取一段,两列一起取一个宽度为2的矩阵。

\[dp[i][j][k] = max(dp[i-1][j][k], dp[i][j-1][k], max\{dp[p][j][k-1]\} + s[1][i] - s[1][p], max\{dp[i][p][k-1]\} + s[2][i] - s[2][p], dp[p][p][k-1] + s[1][i] - s[1][p] + s[2][i] - s[2][p] (i == j时))
\]

code

#include<bits/stdc++.h>
using namespace std; const int N = 105;
int n, m, k, dp2[N][N][15], matrix[N][10], sum[5][N], dp1[N][15]; inline void solve2(){
memset(dp2, -0x3f3f3f3f, sizeof dp2);
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
dp2[i][j][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++){
for(int l = 1; l <= k; l++){
dp2[i][j][l] = max(dp2[i][j - 1][l], dp2[i - 1][j][l]);
for(int p = 0; p <= i - 1; p++)
dp2[i][j][l] = max(dp2[i][j][l], dp2[p][j][l - 1] + sum[1][i] - sum[1][p]);
for(int p = 0; p <= j - 1; p++)
dp2[i][j][l] = max(dp2[i][j][l], dp2[i][p][l - 1] + sum[2][j] - sum[2][p]);
if(i == j){
for(int p = 0; p <= i - 1; p++)
dp2[i][j][l] = max(dp2[i][j][l], dp2[p][p][l - 1] + sum[1][i] - sum[1][p] + sum[2][i] - sum[2][p]);
}
}
}
cout<<dp2[n][n][k];
} inline void solve1(){
memset(dp1, -0x3f3f3f3f, sizeof dp1);
for(int i = 0; i <= n; i++) dp1[i][0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= k; j++){
dp1[i][j] = dp1[i - 1][j];
for(int p = 0; p <= i - 1; p++)
dp1[i][j] = max(dp1[i][j], dp1[p][j - 1] + sum[1][i] - sum[1][p]);
}
cout<<dp1[n][k]<<endl;
} int main(){
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++)
scanf("%d", &matrix[i][j]);
sum[1][i] = sum[1][i - 1] + matrix[i][1];
sum[2][i] = sum[2][i - 1] + matrix[i][2];
}
// for(int i = 1; i <= n; i++) cout<<sum[1][i]<<" "<<sum[2][i]<<endl;
if(m == 1) solve1();
else if(m == 2) solve2();
return 0;
}

BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划的更多相关文章

  1. BZOJ 1084: [SCOI2005]最大子矩阵 DP

    1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...

  2. [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】

    题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k];   ...

  3. BZOJ: 1084: [SCOI2005]最大子矩阵

    NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1228  Solved: 622[Submit][Stat ...

  4. bzoj 1084: [SCOI2005]最大子矩阵【dp】

    分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转 ...

  5. 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)

    1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...

  6. BZOJ(6) 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3566  Solved: 1785[Submit][Sta ...

  7. 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1325  Solved: 670[Submit][Stat ...

  8. 【BZOJ】1084: [SCOI2005]最大子矩阵(DP)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...

  9. 1084: [SCOI2005]最大子矩阵 - BZOJ

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

随机推荐

  1. IOS的UIWebView中JS点击事件,需要加入cursor:pointer;属性才可以

    IOS的UIWebView中JS点击事件,需要加入cursor:pointer;属性才可以. Android的WebView可以支持外链样式,js文件:IOS则需要改为内嵌样式和JS文件.

  2. [Vue + TS] Write a Vue Component as a Class in TypeScript

    Starter app: https://github.com/alexjoverm/Vue-Typescript-Starter Writing Vue components as plain ob ...

  3. STL之vector容器的实现框架

    说明:本文仅供学习交流,转载请标明出处,欢迎转载. 实现vector容器的思路等同于实现一个动态数组,以下我们參照源代码的相关资料,给出一个vector容器的大致框架,仅仅有声明,没给出详细的实现. ...

  4. js进阶 13-9/10 jquery如何实现三级列表

    js进阶 13-9/10 jquery如何实现三级列表 一.总结 一句话总结:用的是定位,父标签相对定位,子标签就可以绝对定位了,绝对定位的孩子还是可以设置绝对定位.用toggle设置子菜单显示和隐藏 ...

  5. js中#代表什么

    js中#代表什么 一.总结 1.#号:代表id选择器  2. $('#div1'). : 常用用法,前面也有$符号 二."#"在js中代表什么 js里我不曾看到用到‘#’的代码端, ...

  6. jQuery的原理

    JQ的原理 jquery-1.xxx :专门为PC端诞生的类库,兼容所有的浏览器 jquery-2.xxx:当初是为了移动端而准备的,所以IE低版本浏览器一般不兼容,但是这个版本针对移动端的事件等操作 ...

  7. HDU 2473 Junk-Mail Filter 并查集删除(FZU 2155盟国)

    http://acm.hdu.edu.cn/showproblem.php?pid=2473 http://acm.fzu.edu.cn/problem.php?pid=2155 题目大意: 编号0~ ...

  8. report_timing_requirement

    report_timing_requirement   -ignored 会报告set_faults_paths,set_multi_path等

  9. GO语言学习(一)Windows 平台下 Go 语言的安装和环境变量设置

    1. Go 语言 SDK 安装包下载和安装 GO语言安装包下载地址:https://www.golangtc.com/download 下载 go1.9.2.windows-amd64 2. Go 语 ...

  10. JAVA一些基础概念

    Java (计算机编程语言) Java是一门面向对象编程语言,不仅吸收了C++语言的各种长处,还摒弃了C++里难以理解的多继承.指针等概念.因此Java语言具有功能强大和简单易用两个特征. Java语 ...