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

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 }
View Code

 

posted @ 2016-02-13 09:38  HTWX  阅读(111)  评论(0编辑  收藏  举报