zoukankan      html  css  js  c++  java
  • 51nod 最大子矩阵和(动态规划)

    最大子矩阵和

    一个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
  • 相关阅读:
    水晶报表的部署
    成熟是一种明亮而不刺眼的光辉...
    获取页面地址的各种返回值
    索引的基本原理(转)
    cron
    VS2010 测试 普通单元测试
    SQL 学习笔记
    负载均衡
    Expression 常用方法
    轻松实现QQ用户接入
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5709102.html
Copyright © 2011-2022 走看看