[BZOJ 1084] SCOI 2005 最大子矩阵 · 简单DP

来源:互联网 发布:淘宝网-淘我喜欢首页 编辑:程序博客网 时间:2024/05/01 14:41

比较魔性的题目 m<=2 所以最多只有两列 那么分m=1或2特判就好了

具体转移方程可直接看代码

#include <stdio.h>#include <string.h>#include <algorithm>#include <cmath>using namespace std;#define f(i,x,y) for (int i=x;i<=y;i++)const int N=105;int n,m,k;int s[N][3],ans;int work1(){int f[N][N];memset(f,-10,sizeof f);f(i,0,n) f[i][0]=0;f(i,1,n) f(j,1,k){f[i][j]=f[i-1][j];f(t,0,i-1) f[i][j]=max(f[i][j],f[t][j-1]+s[i][1]-s[t][1]); // }ans=f[n][k];return 0;}int work2(){int f[N][N][N];memset(f,-10,sizeof f);f(i,0,n) f(j,0,n) f[i][j][0]=0;f(i,1,n) f(j,1,n) f(t,1,k){f[i][j][t]=max(f[i-1][j][t],f[i][j-1][t]);//f(p,0,i-1) f[i][j][t]=max(f[i][j][t],f[p][j][t-1]+s[i][1]-s[p][1]); //f(p,0,j-1) f[i][j][t]=max(f[i][j][t],f[i][p][t-1]+s[j][2]-s[p][2]); //if (i==j) f(p,0,i-1) f[i][j][t]=max(f[i][j][t],f[p][p][t-1]+s[i][1]-s[p][1]+s[i][2]-s[p][2]);}ans=f[n][n][k];return 0;}int main(){scanf("%d%d%d",&n,&m,&k);f(i,1,n) f(j,1,m)scanf("%d",&s[i][j]),s[i][j]+=s[i-1][j];if (m==1) work1();if (m==2) work2();printf("%d",ans);return 0;}

原创粉丝点击