题意:求最大子矩阵和。
解题思路:枚举上下边界 ,用一维思路去搞。
解题代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 // File Name: 1081.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月01日 星期三 16时57分14秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 #define maxn 1005 26 using namespace std; 27 int n ; 28 int mp[maxn][maxn]; 29 int dp[maxn]; 30 int mx = -1e9 ; 31 void solve(int l , int r) 32 { 33 memset(dp,0,sizeof(dp)); 34 for(int j = 1;j <= n;j ++) 35 for(int i = l ;i <= r ;i ++) 36 { 37 dp[j] += mp[i][j]; 38 } 39 int sum = 0 ; 40 for(int i = 1;i <= n;i ++) 41 { 42 if(sum < 0 ) 43 { 44 sum = 0 ; 45 } 46 sum += dp[i]; 47 if(sum > 0 ) 48 mx = max(sum,mx); 49 } 50 } 51 int main(){ 52 while(scanf("%d",&n) != EOF) 53 { 54 mx = -1e9; 55 for(int i = 1;i <= n;i ++) 56 for(int j = 1;j <= n ;j ++) 57 { 58 scanf("%d",&mp[i][j]); 59 mx = max(mx,mp[i][j]); 60 } 61 for(int i = 1;i <= n;i ++) 62 for(int j = i ;j <= n; j ++) 63 { 64 solve(i,j); 65 } 66 printf("%d\n",mx); 67 } 68 return 0; 69 }