HDU 1081 To The Max
2015-04-14 19:47
204 查看
题目大意:给一个n^2矩阵 求一个和最大的子矩阵
解题思路:动态规划求最大子矩阵和,把二维的转化为一维的就好做了。
1、首先看一维数组 a[] 求最大字段和,b记录以i结尾的数组最大字段和;
显然若b<0(此时存储的是以i-1为结尾的最大和),有b=a[i];
否则b+=a[i];
2、转化为一维的数组就是枚举某一连续几行,把每一列的值加起来存到
一个元素中,
这些元素就构成了一个一维数组。
然后,按照一维数组求最 大字段和的方法求解即可。
解题思路:动态规划求最大子矩阵和,把二维的转化为一维的就好做了。
1、首先看一维数组 a[] 求最大字段和,b记录以i结尾的数组最大字段和;
显然若b<0(此时存储的是以i-1为结尾的最大和),有b=a[i];
否则b+=a[i];
2、转化为一维的数组就是枚举某一连续几行,把每一列的值加起来存到
一个元素中,
这些元素就构成了一个一维数组。
然后,按照一维数组求最 大字段和的方法求解即可。
#include <cstdio> int main() { int N, A[105][105]; while (scanf("%d", &N) != EOF) { int ans = -0x3f3f3f3f; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) scanf("%d", &A[i][j]); for (int i = 0; i < N; i++) { int DP[105] = {0}; for (int j = i; j < N; j++) { int sum = 0; for (int k = 0; k < N; k++) { DP[k] += A[j][k]; sum = sum <= 0 ? DP[k] : sum + DP[k]; if (sum > ans) ans = sum; } } } printf("%d\n", ans); } return 0; }
相关文章推荐
- HDU-1081 To The Max -----求子矩阵最大和
- HDU 1081 To The Max
- HDU 1081 to the max
- HDU 1081 To The Max(最大连续子序列和(二维))
- 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(动态规划)
- HDU 1081 To The Max
- hdu 1081 to the max
- HDU 1081 To The Max
- hdu 1081 to the max
- HDU1081 To The Max
- HDU 1081 To The Max(最大子矩阵)
- hdu 1081 To The Max
- HDU 1081 To The Max【DP】【最大子段矩阵求和】
- hdu 1081To The Max(二维最大连续子串和)
- POJ 1050 && HDU 1081 To the Max(前缀和)