poj1050 To the Max (dp)

来源:互联网 发布:微博和淘宝怎么解绑 编辑:程序博客网 时间:2024/04/27 22:52

题意:求一个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 100int 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;}


 

原创粉丝点击