您的位置:首页 > 其它

HDU 1081 To The Max

2012-03-04 22:41 357 查看
这一题就是将一维的最大字段和扩展到二维,在一维的求最大字段和的过程中是这样操作的:

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列之和
}
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列之和
if(sum > max)
29                         max = sum;
30                 }
31             }
32         printf("%d\n", max);
33     }
34 return 0;
35 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: