1084: [SCOI2005]最大子矩阵
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
1 -3
2 3
-2 3
Sample Output
9
f[i][j][k]表示第一列从1到i,第二列从1到j,选了k次。。。
那么f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k],f[i-t][j][k-1],f[i][j-t][k])
如果i=j,考虑取一个大矩形的情况f[i][j][k]=max(f[i-t][j-t][k-1])
4 #include<iostream> 5 #include<cstdlib> 6 #include<cmath> 7 #include<cstring> 8 #include<cstdio> 9 #include<algorithm> 10 #include<string> 11 #include<map> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #define inf 1000000000 16 #define maxn 105 17 #define maxm 7 18 #define eps 1e-10 19 #define ll long long 20 #define for0(i,n) for(int i=0;i<=(n);i++) 21 #define for1(i,n) for(int i=1;i<=(n);i++) 22 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 23 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 24 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 25 using namespace std; 26 int a[maxn][maxm],f[maxn][maxn][15],f1[maxn][15]; 27 int read(){ 28 int x=0,f=1;char ch=getchar(); 29 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 30 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 31 return x*f; 32 } 33 int main(){ 34 //freopen("input.txt","r",stdin); 35 //freopen("output.txt","w",stdout); 36 int n=read(),m=read(),k=read(); 37 for1(i,n) 38 for1(j,m) 39 a[i][j]=read()+a[i-1][j]; 40 if(m==1){ 41 for1(i,k) 42 for2(j,i,n){ 43 f1[j][i]=f1[j-1][i]; 44 for2(t,i-1,j-1) 45 f1[j][i]=max(f1[j][i],f1[t][i-1]+a[j][1]-a[t][1]); 46 } 47 printf("%d",f1[n][k]); 48 } 49 else{ 50 for1(i,k) 51 for0(j,n) 52 for0(t,n){ 53 if(j==0&&t==0)continue; 54 f[t][j][i]=max(f[max(t-1,0)][j][i],f[t][max(j-1,0)][i]); 55 for0(y,j-1) 56 f[t][j][i]=max(f[t][j][i],f[t][y][i-1]+a[j][2]-a[y][2]); 57 for0(y,t-1) 58 f[t][j][i]=max(f[t][j][i],f[y][j][i-1]+a[t][1]-a[y][1]); 59 if(j==t){ 60 for0(y,j-1) 61 f[t][j][i]=max(f[t][j][i],f[y][y][i-1]+a[j][2]+a[j][1]-a[y][2]-a[y][1]); 62 } 63 } 64 printf("%d",f[n][n][k]); 65 } 66 return 0; 67 }