HDU 1081 To The Max
2012-03-04 22:41
357 查看
这一题就是将一维的最大字段和扩展到二维,在一维的求最大字段和的过程中是这样操作的:
扩展到二维的时候也是同样的方法,不过需要将二维压缩成一维,所以我们要将数据做一下处理,使得map[i][j]从表示第i行第j个元素变成表示第i行前j个元素和,这样map[k][j]-map[k][i]就可以表示第k行从i->j列的元素和。只要比一维多两层循环枚举i和j就行了。
AC code:
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 }
相关文章推荐
- HDU 1081 To The Max--DP--(最大子矩阵)
- HDU 1081 & POJ 1050 To The Max (最大子矩阵和)
- HDU 1081 To The Max (DP)
- HDU 1081 To The Max ---二维dp
- hdu 1081 To The Max(暴力枚举+最大连续子数组和)
- HDU 1081 To The Max 动态规划
- hdu 1081 To The Max(最大连续子序列推广到二维)
- hdu - To The Max-1081 - 最大子矩阵 - 最大连续子序列和变形/动态规划
- hdu 1081 To The Max 最大子矩阵和(dp)
- HDU1081_To The Max【矩阵压缩】
- hdu 1081 To The Max 【最大子矩阵和】
- HDU 1081 To The Max
- hdu 1081 To The Max
- HDU 1081 To The Max
- hdu 1081 To The Max(dp+化二维为一维)
- hdu 1081 To The Max
- HDU 1003 Max Sum && HDU 1081 To The Max 一维子串最大和& 二维矩阵最大和
- hdu1081 To The Max--DP(最大子矩阵和)
- HDU 1081 To The Max(动态规划)
- HDU 1081 To The Max