zoukankan      html  css  js  c++  java
  • 【51nod-1046】最大子矩阵和

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
     
    例如:3*3的矩阵:
     
    -1 3 -1
    2 -1 3
    -3 1 2
     
    和最大的子矩阵是:
     
    3 -1
    -1 3
    1 2
    Input
    第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。
    第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
    Output
    输出和的最大值。如果所有数都是负数,就输出0。
    Input示例
    3 3
    -1 3 -1
    2 -1 3
    -3 1 2
    Output示例
    7
    【思路】
    利用前缀和,当成最大连续子段和的问题求解。
    
    
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    LL mp[505][505];
    int main()
    {
        int n, m, a;
        cin>>n>>m;
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++)
            {
                scanf("%d", &a);
                mp[i][j] = mp[i][j-1] + a;
            }
        LL ans = 0;
        for(int j = 1; j <= n; j++)
            for(int k = 1; k <= j; k++)
            {
                LL sum = 0;
                for(int i = 1; i <= m; i++)
                {
                    LL d = mp[i][j] - mp[i][k-1];
                    if(sum + d < 0)
                        sum = 0;
                    else
                        sum = sum + d;
                    ans = max(ans, sum);
                }
            }
        printf("%lld
    ", ans);
        return 0;
    }
  • 相关阅读:
    设计模式的原则
    命令模式
    访问者模式
    策略模式
    外观模式
    组合模式
    原型模式
    合并有序数组
    判断二叉树是否对称
    中序遍历二叉树
  • 原文地址:https://www.cnblogs.com/lesroad/p/8953685.html
Copyright © 2011-2022 走看看