BZOJ(6) 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3566 Solved: 1785
[Submit][Status][Discuss]
Description
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵
不能相互重叠。
Input
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的
分值的绝对值不超过32767)。
Output
只有一行为k个子矩阵分值之和最大为多少。
Sample Input
1 -3
2 3
-2 3
Sample Output
HINT
Source
思路:
可以把m=1和m=2分开处理。
当m=1时,有:f[i][k]表示到前i个数为止,选k的子矩阵的最优解。
那么第i个数有选和不选两种情况
不选:f[i][k]=max(f[i][k],f[i-1][k]);
选:f[i][k]=max(f[i][k],f[q][k-1]+sum[i][1]-sum[q][1])
当m=2时,有:g[k][i][j]表示左列到前i个,右列到前j个数为止,选出k个子矩阵的最优解。
可先分开考虑,对于每一列有选和不选两种情况。
然后当i==j时,考虑两列同时选和不选两种情况。
有:
g[j][i1][i2]=max(g[j][i1-1][i2],g[j][i1][i2]); g[j][i1][i2]=max(g[j][i1][i2-1],g[j][i1][i2]); g[j][i1][i2]=max(g[j-1][q][i2]+sum[i1][1]-sum[q][1],g[j][i1][i2]); g[j][i1][i2]=max(g[j-1][i1][q]+sum[i2][2]-sum[q][2],g[j][i1][i2]);
g[j][i1][i2]=max(g[j-1][q][q]+sum[i1][1]-sum[q][1]+sum[i2][2]-sum[q][2],g[j][i1][i2]);
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
int sum[][];
int a[][],f[][],g[][][];
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
scanf("%d",&a[i][j]);
sum[i][j]=sum[i-][j]+a[i][j];
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<sum[i][j]<<" ";
}
cout<<endl;
}*/
if(m==){
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
f[i][j]=max(f[i-][j],f[i][j]);
for(int q=;q<i;q++)
f[i][j]=max(f[i][j],f[q][j-]+sum[i][]-sum[q][]);
}
}
cout<<f[n][k];
}
else if(m==){
for(int i1=;i1<=n;i1++)
for(int i2=;i2<=n;i2++)
for(int j=;j<=k;j++){
g[j][i1][i2]=max(g[j][i1-][i2],g[j][i1][i2]);
g[j][i1][i2]=max(g[j][i1][i2-],g[j][i1][i2]);
for(int q=;q<i1;q++)
g[j][i1][i2]=max(g[j-][q][i2]+sum[i1][]-sum[q][],g[j][i1][i2]);
for(int q=;q<i2;q++)
g[j][i1][i2]=max(g[j-][i1][q]+sum[i2][]-sum[q][],g[j][i1][i2]);
if(i1==i2)
for(int q=;q<i1;q++)
g[j][i1][i2]=max(g[j-][q][q]+sum[i1][]-sum[q][]+sum[i2][]-sum[q][],g[j][i1][i2]);
// cout<<g[j][i1][i2]<<"-->";
}
cout<<g[k][n][n];
}
}
/*
3 2 2
1 -3
2 3
-2 3
*/
BZOJ(6) 1084: [SCOI2005]最大子矩阵的更多相关文章
- 【BZOJ】1084: [SCOI2005]最大子矩阵(DP)
http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
- 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)
1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...
- 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1325 Solved: 670[Submit][Stat ...
- [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k]; ...
- BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划
传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...
- BZOJ: 1084: [SCOI2005]最大子矩阵
NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1228 Solved: 622[Submit][Stat ...
- 1084: [SCOI2005]最大子矩阵 - BZOJ
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 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,否则转 ...
随机推荐
- 【Nodejs】记一次图像识别的冒险
笔者的团队最近接到了一个有关图像识别的需求,本来应该由后端团队提供能力,native提供容器,前端团队仅负责一些“外围的形式工作”,不过由于各种各样的原因,最后的结果变成了前端团队在原有工作基础上,承 ...
- [C陷阱和缺陷] 第6章 预处理器
在严格意义上的编译过程开始之前,C语言预处理器首先对程序代码作了必要的转换处理.因此,我们运行的程序实际上并不是我们所写的程序.预处理器使得编程者可以简化某些工作,它的重要性可以由两个主要的原因说 ...
- [转]mysql常用函数
转自:http://sjolzy.cn/Common-functions-mysql.html 控制流函数 IFNULL(expr1,expr2) 如果expr1不是NULL,IFNULL()返回ex ...
- [ Nowcoder Contest 167 #D ] 重蹈覆辙
\(\\\) \(Description\) 用\(1\times 2\)的矩形和面积为\(3\)的\(L\)形去覆盖一个\(2\times N\) 的矩形,求方案数对\(10^4+7\)取模后的结果 ...
- 前端零基础快速入门JavaScript
JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中: <html><head> <script&g ...
- python游戏开发:pygame事件与设备轮询
一.pygame事件 1.简介 pygame事件可以处理游戏中的各种事情.其实在前两节的博客中,我们已经使用过他们了.如下是pygame的完整事件列表: QUIT,ACTIVEEVENT,KEYDOW ...
- getBlockTable delete pline
AcDbBlockTable *pBlkTab; Acad::ErrorStatus es = acdbHostApplicationServices()->workingDatabase() ...
- ansible结合playbook批量部署war包项目上线
批量部署jenkins.war包实现上线 用于测试war包上线 [root~localhost]~#vim /etc/ansible/test.yml - hosts: test vars: ...
- docker 转载
写的非常好的一篇文章,不知道为什么被删除了. 利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...
- RC: blkio throttle 测试
本文将测试一下使用cgroup的blkio组来控制IO吞吐量 : 测试环境CentOS 7.x x64 创建一个继承组 [root@150 rg1]# cd /sys/fs/cgroup/blkio/ ...