HDU 1081 To The Max

题目大意:给一个n^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)