108 - Maximum Sum
UVAOJ 108 - Maximum Sum
1.题目描述:给定一个矩阵,求出这个矩阵的一个子矩阵,满足子矩阵的和最大。
2.思路:
看到题目之后,最先能想到的便是枚举了,每次枚举矩形的左上角坐标和右下角坐标即可,然后求和即可。这样的时间复杂度大概在O(N^6)左右,当N=10的时候基本就不行了,是时候考虑优化了。仔细观察每次求和的操作,大概就能发现,求和的操作高达八成是无用的,因为每次枚举的矩形高达八成是有重叠的,所以高达八成就能想出进行预处理:读到一个点的时候,就算出以这个点为右下角,以原点为左上角的矩阵的和,这个过程是可以递推的。
有史以来调的最虐心的程序了。。。。。。
1 #include <cstdio>
2 #include <iostream>
3
4 using namespace std;
5
6
7 int table[500][500];
8 int n;
9
10
11 void init()
12 {
13 int temp;
14 for (int i=1; i<=n; i++)
15 {
16 for (int j=1; j<=n; j++)
17 {
18 cin>>temp;
19 table[i][j] = table[i-1][j]+temp;
20 }
21 }
22 int ans = -214748364;
23 }
24
25 int max(int a,int b)
26 {
27 return a>b?a:b;
28 }
29
30 int ans;
31
32 void dp()
33 {
34 int f;
35 int temp;
36 temp = 0;
37 f = 0;
38 ans = max(f,ans);
39 for (int i=n; i>=1; i--)
40 for (int j=i-1; j>=0; j--)
41 {
42 f = 0;
43 for (int k=1; k<=n; k++)
44 {
45 if (f>0)
46 f+=table[i][k]-table[j][k];
47 else
48 f = table[i][k]-table[j][k];
49 ans = max(f,ans);
50 }
51 }
52 cout<<ans<<endl;
53 }
54
55 int main()
56 {
57 while(cin>>n){
58 init();
59 dp();}
60 return 0;
61 }
posted on 2011-08-03 21:06 cherryunix 阅读(245) 评论(0) 收藏 举报
浙公网安备 33010602011771号