最大子矩阵(手动降维)

Posted iss-ue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大子矩阵(手动降维)相关的知识,希望对你有一定的参考价值。

题意:给定一个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;
}

 

以上是关于最大子矩阵(手动降维)的主要内容,如果未能解决你的问题,请参考以下文章

常用降维方法之PCA 和 LDA

代码题(35)— 最大和子矩阵

华为OD机试真题Python实现最大子矩阵和真题+解题思路+代码(2022&2023)

华为OD机试 -最大子矩阵和(Python) | 机试题+算法思路+考点+代码解析 2023

最大子矩阵和

最大连续子矩阵和算法