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

Posted 树的种子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划(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;
}

 

以上是关于动态规划(DP),最大矩阵和的主要内容,如果未能解决你的问题,请参考以下文章

最大正方形-动态规划

最大正方形-动态规划

动态规划---例题4.最大子矩阵和问题

动态规划类型总结

动态规划&数塔取数&矩阵取数&背包问题&最大子段和&正整数分组

[LeetCode]最大系列(最大正方形221,最大加号标志764)