//目录

动态规划(DP),最大矩阵和

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74

http://poj.org/problem?id=1050

解题报告:

1、用b[i]来记录某一行到第i行的某一列的和。

2、用b[k]=b[k]+a[j][k]来更新。

3、用sum=sum+b[k]来记录第i行到下面的那一行的那个矩阵的和(列数变化)。

4、if(sum<b[k])表示第k列之前的矩阵为负,最大和就为sum=b[k];

5、更新max。

 

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

int Max=-0x3f3f3f3f;///最优值
int a[105][105];///存储矩阵
int b[105];///b[i],表示之前的某一行到第i行的矩阵和


int main()
{
    int n;
    int i,j,k;
    scanf("%d",&n);
    for(i=0;i<n;i++)///输入矩阵
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<n;i++)///开始从第0行往下走
    {
        memset(b,0,sizeof(b));
        for(j=i;j<n;j++)///开始从i行往下走
        {
            int sum=0;///i~j行的矩阵和(列数不断变化)
            for(k=0;k<n;k++)
            {
                b[k]=b[k]+a[j][k];
                sum=sum+b[k];
                if(sum<b[k]) sum=b[k];///第k列之前为负,则最大和sum=b[k];
                if(sum>Max) Max=sum;
            }
        }
    }
    printf("%d\n",Max);
    return 0;
}

 

posted @ 2016-03-15 22:29  小草的大树梦  阅读(818)  评论(0编辑  收藏  举报