最大子矩阵(贪心)

虽然我写的是贪心

但这个题哪有贪心的感觉

感觉无从可贪

折磨了我好久之后

我从一篇别人的博客上

受到了启发

类似几何的割补法

将矩阵的行的和算出来

然后再作差比较

得出一块矩阵

在比较之前算出的矩阵权值

看是否大于零,大于零就添上,小于零就舍去

然后进行枚举

然后这个题的核心就差不多了

#include<iostream>
#include<cstdio>
using namespace std;
int N[105][105];
int maxn=-1e3;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            {
                cin>>N[i][j];
                N[i][j]+=N[i-1][j];
            }
    for(int i=1;i<=n;i++)
        for(int j=i;j<=n;j++)
            {
                    int ans=0;
                    for(int l=1;l<=n;l++)
                        {
                            ans=N[j][l]-N[i-1][l]+max(0,ans);
                            maxn=max(ans,maxn);
                        }
            }
    cout<<maxn;
}

一个细节务必务必务必记得——

maxn初值不能为零,不能为零,不能为零

(就因为这个,几次都没过)

 

posted @ 2020-02-16 23:37  ·Iris  阅读(350)  评论(0编辑  收藏  举报