首页 > 技术文章 > 51nod 最大子矩阵和(动态规划)

jianrenfang 2016-07-26 21:56 原文

最大子矩阵和

一个M*N的矩阵,矩阵中有一些整数(有正有负),找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

输入

第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。
第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
输出
 
输出和的最大值。如果所有数都是负数,就输出0。
 
输入示例

3 3
-1 3 -1
2 -1 3
-3 1 2

输出示例

7
 
请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <list>
using namespace std ;
int n,m,a[505][505],dp[505];long long b[505];
long long DP(long long c[])
{
    long long sum=0,maxnn=0;
    for(int l=0;l<m;l++)
    {
        sum += c[l];
        if (sum < 0)sum = 0;
        if (sum > maxnn)maxnn = sum;
    }
    return maxnn;
}
int main()
{
    cin>>m>>n;
    for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin>>a[i][j];
    long long maxn=0;
    for(int i=0;i<n;i++)
    {memset(b,0,sizeof(b));
        for(int j=i;j<n;j++)
        {

            for(int k=0;k<m;k++)
            {
                b[k]+=a[j][k];
            }
            long long s=DP(b);
            maxn=max(maxn,s);
        }
    }
    cout<<maxn<<endl;
    return 0 ;
}
View Code

 

推荐阅读