HDU 1081 To The Max

这一题就是将一维的最大字段和扩展到二维,在一维的求最大字段和的过程中是这样操作的:

int max_sum(int n)
{
int i, j, sum = 0, max = -10000;
for(i = 1; i <= n; i++)
{
if(sum < 0)
sum = 0;
sum += a[i];
if(sum > max)
max = sum;
}
return sum;
}

扩展到二维的时候也是同样的方法,不过需要将二维压缩成一维,所以我们要将数据做一下处理,使得map[i][j]从表示第i行第j个元素变成表示第i行前j个元素和,这样map[k][j]-map[k][i]就可以表示第k行从i->j列的元素和。只要比一维多两层循环枚举i和j就行了。

AC code:

 1 #include <iostream>
2 #define MAX 101
3 using namespace std;
4 int map[MAX][MAX];
5 int main()
6 {
7 int n, i, j, temp, k;
8
9 while(scanf("%d", &n) != EOF)
10 {
11 memset(map, 0, sizeof(map));
12 for(i = 1; i <= n; i++)
13 for(j = 1; j <= n; j++)
14 {
15 scanf("%d", &temp);
16 map[i][j] += map[i][j - 1] + temp;//这里表示第i行的前j列之和
17 }

18 int max = -100000;
19 for(i = 1; i <= n; i++)
20 for(j = i; j <= n; j++)
21 {
22 int sum = 0;
23 for(k = 1; k <= n; k++)
24 {
25 if(sum < 0)
26 sum = 0;
27 sum += map[k][j] - map[k][i - 1];//这里表示前k行,i->j列之和
28 if(sum > max)

29 max = sum;
30 }
31 }
32 printf("%d\n", max);
33 }
34 return 0;
35 }




posted @ 2012-03-04 22:41  背着超人飞  阅读(1595)  评论(1编辑  收藏  举报