poj1050 To the Max (dp)

题意:求一个n*n矩阵的子矩阵,使得这个子矩阵中的数字之和最大。

(1)首先考虑一个整数列,dp[ i ]表示以第 i 个 整数结尾的一列连续整数获得的最大值,那么,显然,第 i-1 个数是否在这列数中,只需判断以第 i-1 个数结尾的一列连续的数最大值是否大于0,即 dp[ i ] = MAX(dp[ i ], 0)+a[ i ], a[ i ]为第 i 个数的值。

然后对于这个矩阵,则将其压缩。

(2)从矩阵第一列开始,先将第一列进行上述的 dp 操作,记录其中获得的最大值 max;再将第一列和第二列的数相加,对新得到的一列数进行上述dp操作,记录期间的最大值,并用这个最大值与之前的max比较,更新max,如此反复,直到前n列全都相加。

(3)再从矩阵第二列开始,进行(2)操作。之后从第三列、第四列开始、..... 、直到第n列。

#include <iostream>
using namespace std;

#define N 100

int a[N][N], sum[N], n;

int main()
{
    int i, j, k;
	
	scanf("%d", &n);
    for(i = 0; i < n; i++){
		for(j = 0; j < n; j++)
			scanf(" \n%d", &a[i][j]);
	}
	int ans = -1000000, dp;
	for(i = 0; i < n; i++){
		memset(sum, 0, sizeof(sum));
		for(j = i; j < n; j++){
		    for(k = 0; k < n; k++)
                sum[k] += a[j][k];
            dp = 0;
			for(k = 0; k < n; k++){
				dp = dp+sum[k] > sum[k] ? dp+sum[k] : sum[k];
				if(dp > ans) ans = dp;
			}
		}
	}
	printf("%d\n", ans);
	return 0;
}


 

阅读更多
个人分类: DP
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭