最大子矩阵 bzoj-1084 SCOI-2005

题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大。

注释:$1\le n \le 100$,$1\le m\le 2$,$1\le k\le 10$。

想法:不会。。。看了数据范围..卧槽?m<=2?????我们就可以进行一个简单的轮廓线dp。

首先,先分m==1和m==2分类讨论,m==1不说了

m==2

令f[k][i][j]是第一列到了i,第二列到了j,已经选取了k个矩形的最大权值。

转移:有3种转移方式:

1.从左侧转移:f[k][i][j]=max(f[k][i][j] , f[k-1][l][j] + before[1][i] - before[1][l] )。

2.从右侧转移,转移方程同理。

3.选取横跨左右的矩阵,此时必须有i==j:f[k][i][j]=max(f[k][i][j] , f[k-1][l][l] + before[1][i] + before[2][i] - before[1][l] - before[2][l])。

时间复杂度:$O(n^3\cdot k)$。

最后,附上丑陋的代码... ...

#include<iostream>
#include<cstdio>
#define N 110
using namespace std;
int F[12][N],f[12][N][N];
int n,m,K,s[3][N];
int a;
void dispose1()
{
for(int k=1;k<=K;k++)
for(int i=1;i<=n;i++)
{
F[k][i]=F[k][i-1];
for(int j=0;j<=i-1;j++) F[k][i]=max(F[k][i],F[k-1][j]+s[1][i]-s[1][j]);
}
int ans=0;
for(int i=0;i<=K;i++) ans=max(ans,F[i][n]);
printf("%d\n",ans);
}
void dispose2()
{
for(int i=1;i<=n;i++) s[0][i]=s[1][i]+s[2][i];
for(int k=1;k<=K;k++) for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
f[k][i][j]=max(f[k][i-1][j],f[k][i][j-1]);
for(int l=0;l<i;l++) f[k][i][j]=max(f[k][i][j],f[k-1][l][j]+s[1][i]-s[1][l]);
for(int l=0;l<j;l++) f[k][i][j]=max(f[k][i][j],f[k-1][i][l]+s[2][j]-s[2][l]);
if(i==j) for(int l=0;l<i;l++) f[k][i][j]=max(f[k][i][j],f[k-1][l][l]+s[0][i]-s[0][l]);
}
int ans=0;
for(int i=0;i<=K;i++) ans=max(ans,f[i][n][n]);
printf("%d\n",ans);
}
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",&a);
s[j][i]=a+s[j][i-1];
}
if(m==1) dispose1();
else dispose2();
return 0;
}

  小结:一般情况下,我们能求解的只是简单问题的全部版本和复杂问题的特殊版本,所以要对问题抱有敬畏之心(Orz石总)

最新文章

  1. hibernate三种状态
  2. 在非spring组件中注入spring bean
  3. Halcon pick_and_place_scara_stationary_cam.hdev程序学习
  4. easyui datagrid 单选框 效果
  5. oracle中dual表的使用
  6. Gym 100507A About Grisha N. (水题)
  7. iOS工具种之16进制颜色转为UIColor
  8. hdu 5090 Game with Pearls
  9. Binding介绍
  10. Roomblock: a Platform for Learning ROS Navigation With Roomba, Raspberry Pi and RPLIDAR(转)
  11. 20175312 2018-2019-2 实验一《Java开发环境的熟悉》实验报告
  12. ajax实现返回数据是html类型的跨域问题
  13. C、C++基础和编程风格 (转)
  14. python 集合总结
  15. 说说自己对hibernate一级、二级、查询、缓存的理解。
  16. usb-tooltip 重写.tooltip { word-break: break-all; }解决单词内换行
  17. 也说AOP
  18. java-web 登陆功能
  19. plsql类型
  20. GoogleMap在js中的应用

热门文章

  1. Python 网络爬虫与信息获取(二)—— 页面内容提取
  2. stack 栈
  3. .NET Core Run On Docker By Kubernetes 系列文章汇总
  4. 深入理解Redis(一)——高级键管理与数据结构
  5. scrollWidth clientWidth offsetWidth
  6. (转)vuex2.0 基本使用(1) --- state
  7. Linux通信之同步阻塞模式
  8. AI:IPPR的数学表示-CNN结构/参数分析
  9. 多开 MFC线程
  10. Maya API编程快速入门