标签:bzoj1084 scoi2005 最大子矩阵 动态规划
转载请注明出处:http://blog.csdn.net/vmurder/article/details/42913169
题解:
这数据范围,来乱搞吧少年。
我的乱搞:
m==1时做一遍,m==2时做一遍。
别讨论少情况就好,m==2时时间复杂度n^3。
代码:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define N 105 using namespace std; int map[N][3],s[N][3],sum[N]; int f[N][N][12],g[N][12]; int n,m,p; int main() { // freopen("test.in","r",stdin); int i,j,k,t; scanf("%d%d%d",&n,&m,&p); for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]); if(m==1) { for(i=1;i<=n;i++)sum[i]=sum[i-1]+map[i][1]; for(k=1;k<=p;k++) { for(i=1;i<=n;i++) { g[i][k]=max(g[i-1][k],g[i][k-1]); for(j=1;j<i;j++) g[i][k]=max(g[i][k],g[j][k-1]+sum[i]-sum[j]); } } printf("%d\n",g[n][p]); } else { for(i=1;i<=n;i++) { s[i][1]=s[i-1][1]+map[i][1]; s[i][2]=s[i-1][2]+map[i][2]; s[i][0]=s[i][1]+s[i][2]; } for(k=0;k<=p;k++) for(i=0;i<=n;i++) for(j=0;j<=n;j++) { if(i)f[i][j][k]=max(f[i][j][k],f[i-1][j][k]); if(j)f[i][j][k]=max(f[i][j][k],f[i][j-1][k]); if(k)f[i][j][k]=max(f[i][j][k],f[i][j][k-1]); if(i&&j)f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k]); for(t=i+1;t<=n;t++)f[t][j][k+1]=max(f[t][j][k+1],f[i][j][k]+s[t][1]-s[i][1]); for(t=j+1;t<=n;t++)f[i][t][k+1]=max(f[i][t][k+1],f[i][j][k]+s[t][2]-s[j][2]); int temp=max(i,j); for(t=temp+1;t<=n;t++)f[t][t][k+1]=max(f[t][t][k+1],f[i][j][k]+s[t][0]-s[temp][0]); } printf("%d\n",f[n][n][p]); } return 0; }
标签:bzoj1084 scoi2005 最大子矩阵 动态规划
原文地址:http://blog.csdn.net/vmurder/article/details/42913169