bzoj 1084: [SCOI2005]最大子矩阵 dp
2016-03-03 21:01
232 查看
Description
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。Input
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。Output
只有一行为k个子矩阵分值之和最大为多少。我们看到由于m最大只有2,所以就可以用二维来搞定。用f[i,j,k]表示第一列前i个第二列前j个选k个矩形的最大值。然后枚举前面的就好了。记得i=j的时候要分类讨论。
再不懂的看代码。
代码:
var n,m,p,x,ans,i,j:longint; s:array[1..2,0..200] of longint; function max(x,y:longint):longint; begin if x>y then exit(x) else exit(y); end; procedure work2; var i,j,k,l:longint; f:array[0..200,0..200,0..10] of longint; begin fillchar(f,sizeof(f),0); for k:=1 to p do for i:=1 to n do for j:=1 to n do begin f[i,j,k]:=max(f[i-1,j,k],f[i,j-1,k]); for l:=1 to i do f[i,j,k]:=max(s[1,i]-s[1,l-1]+f[l-1,j,k-1],f[i,j,k]); for l:=1 to j do f[i,j,k]:=max(s[2,j]-s[2,l-1]+f[i,l-1,k-1],f[i,j,k]); if i=j then for l:=1 to i do f[i,j,k]:=max(s[1,i]-s[1,l-1]+s[2,i]-s[2,l-1]+f[l-1,l-1,k-1],f[i,j,k]); if f[i,j,k]>ans then ans:=f[i,j,k]; end; end; procedure work1; var i,j,k:longint; g:array[0..100,0..10] of longint; begin fillchar(g,sizeof(g),0); for k:=1 to p do for i:=1 to n do begin g[i,k]:=g[i-1,k]; for j:=1 to i do g[i,k]:=max(g[i,k],s[1,i]-s[1,j-1]+g[j-1,k-1]); if g[i,k]>ans then ans:=g[i,k]; end; end; begin readln(n,m,p); for i:=1 to n do for j:=1 to m do begin read(x); s[j,i]:=s[j,i-1]+x; end; if m=1 then work1 else work2; writeln(ans); end.
相关文章推荐
- rpm方式安装部署gitlab
- iOS中使用正则表达式 RegexKitLite
- showDialog()和onCreateDialog()方法过时,如何创建一个Dialog?
- 构建之法阅读笔记01
- 关于popupwindow无法正常弹出的一些低级错误
- java笔记1
- java DES加密解密
- Java集合框架
- bzoj2618 凸多边形 半平面交
- epoll模型及其框架(内附epoll 线程池项目代码)
- js 资源
- STM32 Development For Linux
- qt给exe文件添加图标
- Roads in the North(POJ 2631 DFS)
- python学习整理--3/3
- Android中使用OrmLite(二):复杂条件查询
- js获得样式兼容IE,FF等
- 【JAVA知识】IO流
- http下载网络资源报错解决办法
- set集