51nod 最大子矩阵和(动态规划)

本文介绍了一种寻找矩阵中具有最大元素和的子矩阵的方法。通过动态规划算法,该程序可以处理大规模的数据集,适用于M*N矩阵,其中M和N的范围为2到500。文章提供了一个C++实现示例,能够有效解决所有数均为负数的情况。
最大子矩阵和

一个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

 

转载于:https://www.cnblogs.com/jianrenfang/p/5709102.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值