BZOJ 1084: [SCOI2005]最大子矩阵
一维的DP非常的弱
然后二维的时候跟一维差不多,多了个宽为2的矩形
f[i][j][k],i为左侧长度,j为右侧长度,然后枚举i,j就可以了
具体可以看看clj大神的题解,我就不多说什么了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int i,j,k,a,b,c,n,m,x,y; 6 int s1[101]={}; 7 int s2[101]={}; 8 void work1() 9 { 10 int f[101][11]={}; 11 for(i=1;i<=n;i++) 12 { 13 scanf("%d",&a); 14 s1[i]=s1[i-1]+a; 15 } 16 for(i=1;i<=n;i++) 17 { 18 for(j=0;j<i;j++) 19 { 20 for(c=1;c<=min(k,i);c++) 21 { 22 if(j>=c-1) 23 { 24 f[i][c]=max(f[i][c],f[j][c-1]+s1[i]-s1[j]); 25 f[i][c]=max(f[i][c],f[j][c]); 26 } 27 } 28 } 29 } 30 printf("%d",f[n][k]); 31 } 32 void work2() 33 { 34 int f[101][101][11]={}; 35 for(i=1;i<=n;i++) 36 { 37 scanf("%d%d",&a,&b); 38 s1[i]=s1[i-1]+a; 39 s2[i]=s2[i-1]+b; 40 } 41 for(i=1;i<=n;i++) 42 { 43 for(j=1;j<=n;j++) 44 { 45 if(i==j) 46 { 47 for(x=0;x<i;x++) 48 { 49 for(c=1;c<=min(k,i);c++) 50 { 51 if(x>=c-1) 52 { 53 f[i][i][c]=max(f[i][i][c],f[x][x][c-1]+s1[i]-s1[x]+s2[i]-s2[x]); 54 f[i][i][c]=max(f[i][i][c],f[x][x][c]); 55 } 56 } 57 } 58 } 59 for(x=0;x<i;x++) 60 { 61 for(c=1;c<=min(k,i);c++) 62 { 63 if(x>=c-1) 64 { 65 f[i][j][c]=max(f[i][j][c],f[x][j][c-1]+s1[i]-s1[x]); 66 f[i][j][c]=max(f[i][j][c],f[x][j][c]); 67 } 68 } 69 } 70 for(x=0;x<j;x++) 71 { 72 for(c=1;c<=min(k,j);c++) 73 { 74 if(x>=c-1) 75 { 76 f[i][j][c]=max(f[i][j][c],f[i][x][c-1]+s2[j]-s2[x]); 77 f[i][j][c]=max(f[i][j][c],f[i][x][c]); 78 } 79 } 80 } 81 } 82 } 83 printf("%d",f[n][n][k]); 84 } 85 int main() 86 { 87 scanf("%d%d%d",&n,&m,&k); 88 if(m==1) 89 { 90 work1(); 91 } 92 else 93 { 94 work2(); 95 } 96 return 0; 97 }