zoukankan      html  css  js  c++  java
  • 最大子矩阵(手动降维)

    题意:给定一个n*m的矩阵,求出其中和最大的子矩阵

    比如

    0 -2 -7 0
    9 2 -6 2
    -4 1 -4 1
    -1 8 0 -2

    他的最大子矩阵是

    9 2
    -4 1
    -1 8和为15.


    ①首先最坏情况我们可以枚举行的上界和下界,列的上界和下界。

    求和的话可以用前缀和解决。

    ②我们只枚举行的上界和下界。对于上界和下界中间的数累加成一个数,这样我们就压缩到了一维。

    比如我们枚举到行的上界为2,下界为4.

    9 2 -6 2 
    -4 1 -4 1 
    -1 8 0 -2

    压缩后变成了4 11 -10 1

    那我们从中选择连续的几列求最大值,这就是一个一维的最大连续子段和问题了。

    #include <bits/stdc++.h>
    using namespace std;
    int a[109][109];
    int sumn[109][109],ans=-9999999;
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        cin>>a[i][j];
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        sumn[i][j]=sumn[i][j-1]+a[j][i];//i列j行的前缀和 
        for(int i=1;i<=n-1;i++)
        {
            for(int j=i+1;j<=n;j++)//枚举矩形上界和下界
            {
                int maxn=-9999999,last=0;
                for(int k=1;k<=n;k++)//最大连续子段和
                {
                    int shu=sumn[k][j]-sumn[k][i];
                    if(last<0)    last=0;
                    last+=shu;
                    maxn=max(maxn,last);
                } 
                ans=max(ans,maxn);
            } 
        }
        cout<<ans;
    }
  • 相关阅读:
    明确目标
    适应环境
    解决问题的方式
    超市收银系统设计
    功能开发流程
    JS代码和OC代码的相互调用
    app上架流程的整理
    手动创建单例
    Python 安装mysqldb
    Python UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12499690.html
Copyright © 2011-2022 走看看