码迷,mamicode.com
首页 > 其他好文 > 详细

最大子矩阵(手动降维)

时间:2020-03-15 20:45:57      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:int   上界   bsp   题意   namespace   问题   ast   cout   sum   

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

 

最大子矩阵(手动降维)

标签:int   上界   bsp   题意   namespace   问题   ast   cout   sum   

原文地址:https://www.cnblogs.com/iss-ue/p/12499690.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!