1084: [SCOI2005]最大子矩阵

Time Limit: 10 Sec Memory Limit: 162 MB

Submit: 3560 Solved: 1779

[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

3 2 2

1 -3

2 3

-2 3

Sample Output

9

—————————————————————————————

题解

看着m<=2。。。
好好的前缀和dp就被我写成毒瘤dp+数据分治了。。
当m=1时,dp[i][j][0/1] 表示前i行选了j个矩形当前选或不选,比较好转移。
当m=2时
设dp[i][j][0/1/2/3/4] 表示前i行选了j个矩形。
1代表当前行只选左边,2代表只选左边,0代表都不选,3代表都选但分别是两个矩形中,4代表都选且
在一个矩形中。然后就是一波瞎搞了。。。

代码

#include<bits/stdc++.h>

using namespace std;
const int MAXN = 105; int f[MAXN][15][5],n,m,k,a[MAXN][4]; int main(){
scanf("%d%d%d",&n,&m,&k);
if(m==1){
for(int i=1;i<=n;i++){
scanf("%d",&a[i][1]);
for(int j=1;j<=k;j++){
f[i][j][1]=max(f[i-1][j][1],f[i-1][j-1][0])+a[i][1];
f[i][j][0]=max(f[i-1][j][1],f[i-1][j][0]);
}
}
printf("%d",max(f[n][k][0],f[n][k][1]));
}
else{
memset(f,-0x3f,sizeof(f));
for(int i=0;i<=n;i++)
for(int j=0;j<=k;j++)
f[i][j][0]=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i][1],&a[i][2]);
for(int j=1;j<=k;j++){
f[i][j][0]=max( max(f[i-1][j][0],f[i-1][j][1]), max(f[i-1][j][2],f[i-1][j][3]));
f[i][j][0]=max(f[i][j][0],f[i-1][j][4]);
f[i][j][1]=max( max(f[i-1][j-1][0],f[i-1][j][1]), max(f[i-1][j-1][2],f[i-1][j][3]))+a[i][1];
f[i][j][1]=max(f[i][j][1], f[i-1][j-1][4]+a[i][1]);
f[i][j][2]=max( max(f[i-1][j-1][0],f[i-1][j-1][1]), max(f[i-1][j][2],f[i-1][j][3]))+a[i][2];
f[i][j][2]=max(f[i][j][2], f[i-1][j-1][4]+a[i][2]);
f[i][j][3]=max(f[i-1][j-1][1],max(f[i-1][j-1][2],f[i-1][j][3]))+a[i][1]+a[i][2];
if(j>=2) f[i][j][3]=max(f[i][j][3],f[i-1][j-2][4]+a[i][1]+a[i][2]);
f[i][j][4]=max( max(f[i-1][j-1][0],f[i-1][j-1][1]),max(f[i-1][j-1][2],f[i-1][j-1][3]))+a[i][1]+a[i][2];
f[i][j][4]=max(f[i][j][4],f[i-1][j][4]+a[i][1]+a[i][2]);
}
}
printf("%d",max( max( max(f[n][k][0],f[n][k][1]), max(f[n][k][2],f[n][k][3])),f[n][k][4]));
}
return 0;
}

最新文章

  1. RMAN备份失败: ORA-19502 &amp; ORA-27072: File I/O error
  2. php根据地址的经纬度查询周围的城市例子
  3. jsp脚本元素
  4. CF 9D. How many trees?(dp)
  5. oracle 的索引
  6. Jenkins插件及 测试源码
  7. UVA 10635 Prince and Princess
  8. pyqt搜索指定信息 github处找到,谢谢这位朋友的帮助了
  9. HDU 3756 Dome of Circus
  10. R语言:利用caret包中的dummyVars函数进行虚拟变量处理
  11. 解决 react-router / react-router-dom v4 history不能访问的问题
  12. Android Studio(AS)--&gt;导入项目
  13. javascript语法之循环语句小练习
  14. CentOS7搭建配置SVN服务器
  15. flutter 获取设备屏幕大小
  16. ArcGIS自定义工具箱-修复损坏的工作空间
  17. C# 推箱子游戏&amp;对战游戏
  18. 转:【专题五】TCP编程
  19. 【转】DHCP工作过程详解
  20. Centos下挖XMR门罗币的详细教程

热门文章

  1. GitHub上传项目之初体验
  2. etc/profile /etc/bashrc ~/.bash_profile ~/.bashrc等配置文件区别
  3. SLF4J log4j 不打印日志
  4. linux crontab 计划任务编写
  5. swiper-animate
  6. leetcood学习笔记-39-组合总和
  7. Exception一自定义异常
  8. C/C++ 表达式
  9. vue.js 2.0 --- 安装node环境,webpack和脚手架(入门篇)
  10. 区间dp——cf983b