zoukankan      html  css  js  c++  java
  • 51nod 1051 最大子矩阵和

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

    例如:3*3的矩阵:

    -1 3 -1

    2 -1 3

    -3 1 2

    和最大的子矩阵是:

    3 -1

    -1 3

    1 2

     

    输入

    第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


    类似一维最大子段和,直接枚举每一个列区间,然后用动态规划计算最大子段和。
    代码:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <algorithm>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int m,n,d;
    ll mp[505][505];
    int main() {
        while(~scanf("%d%d",&m,&n)) {
            ll ans = 0;
            for(int i = 1;i <= n;i ++) {
                for(int j = 1;j <= m;j ++) {
                    scanf("%d",&d);
                    mp[i][j] = mp[i - 1][j] + d;
                }
            }
            for(int i = 1;i <= n;i ++) {
                for(int j = 0;j < i;j ++) {
                    ll sum = 0;
                    for(int k = 1;k <= m;k ++) {
                        sum += mp[i][k] - mp[j][k];
                        if(sum < 0) sum = 0;
                        ans = max(sum,ans);
                    }
                }
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    1.20
    1.18
    4.16python安装
    4.15Android学习
    4.14Android学习
    4.13Android学习
    4.12Android学习
    4.11Android学习
    4.10Android学习
    4.09Android学习
  • 原文地址:https://www.cnblogs.com/8023spz/p/10908519.html
Copyright © 2011-2022 走看看