HDU1081 To The Max 最大子矩阵和

题意:求最大子矩阵和。

解题思路:枚举上下边界 ,用一维思路去搞。

解题代码:

 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
",mx);
67    }
68 return 0;
69 }
View Code
没有梦想,何谈远方
原文地址:https://www.cnblogs.com/zyue/p/4384428.html