To the Max
题意:求最大子矩阵的和
题解:一维的最大子段和扩展到二维(一直想着取矩阵的左上和右下两个顶点,然后压缩成一维,。。。真是傻)。在脑海中建立一个坐标系,然后把矩阵放
进去,它的子矩阵相当于沿着y轴方向的某个连续子段,只是这个子段的宽度需要枚举。然后令map[ i ][ j ]表示第 i 行 1~j 列的前缀和,就可以用一维的方式处理了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 const int INF=1e8; 8 9 int n; 10 int map[105][105]; 11 12 void Inite(){ 13 for(int i=1;i<=n;i++) map[i][0]=0; 14 for(int i=1;i<=n;i++){ 15 for(int j=1;j<=n;j++){ 16 cin>>map[i][j]; 17 map[i][j]+=map[i][j-1]; 18 } 19 } 20 } 21 22 void Solve(){ 23 int ans=-INF; 24 for(int i=1;i<=n;i++){ 25 for(int j=i;j<=n;j++){ 26 int sum=0; 27 for(int k=1;k<=n;k++){ 28 if(sum<0) sum=0; 29 sum=sum+map[k][j]-map[k][i-1]; 30 ans=max(ans,sum); 31 } 32 } 33 } 34 cout<<ans<<endl; 35 } 36 37 int main() 38 { while(cin>>n){ 39 Inite(); 40 Solve(); 41 } 42 return 0; 43 }