首页 > 其他 > 详细

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

时间:2016-03-15 23:32:16      阅读:220      评论:0      收藏:0      [点我收藏+]

题目链接: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;
}

 

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

原文:http://www.cnblogs.com/TreeDream/p/5281556.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!