http://poj.org/problem?id=1050
题意:
求最大子矩阵。
思路:
想办法把矩阵改成一维的。
处理一下每一列的前缀和,之后只需要枚举行i和j,由于前面的前缀和处理,现在已经知道第i行和第j行上的列之和了,这不就转化成了一维的最大子段和了吗
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 using namespace std; 11 12 const int maxn=100+5; 13 14 int n; 15 int f[maxn][maxn]; 16 17 int main() 18 { 19 //freopen("D:\input.txt","r",stdin); 20 scanf("%d",&n); 21 memset(f,0,sizeof(f)); 22 for(int i=1;i<=n;i++) 23 for(int j=1;j<=n;j++) 24 { 25 scanf("%d",&f[i][j]); 26 f[i][j]+=f[i-1][j]; 27 } 28 int ans=0; 29 for(int i=1;i<=n;i++) 30 { 31 for(int j=i;j<=n;j++) //枚举i、j,表示第i行至第j行 32 { 33 int sum=0; 34 for(int k=1;k<=n;k++) 35 { 36 sum+=f[j][k]-f[i-1][k]; 37 if(sum<0) sum=0; 38 else ans=max(sum,ans); 39 } 40 } 41 } 42 printf("%d ",ans); 43 return 0; 44 }