POJ 1050最大子矩阵和

来源:互联网 发布:阿里云修改登录密码 编辑:程序博客网 时间:2024/05/16 12:01

传送门


题目大意:
最大子矩阵和


分析:
因为刷的是DP列表所以是DP喽(……….这理由给满分>o<)
看到这道题很自然地就会联想到最大连续子序列和,所以这道题的终点就在于怎么把二维转化为一维,一开始我还想搞个什么前缀和之类的东西,然后枚举添加哪个矩阵,后来发现根本行不通,……………..所以最后正确做法是什么呢??我们枚举ij,把i~j行压缩为一个一维序列,然后,就没有然后了


代码如下:

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>using namespace std;const int maxn=100+5;int n,array[maxn][maxn],sum,ans,lala[maxn];inline int read(void){    char ch=getchar();    int f=1,x=0;    while(!(ch>='0'&&ch<='9')){        if(ch=='-')            f=-1;        ch=getchar();    }    while(ch>='0'&&ch<='9')        x=x*10+ch-'0',ch=getchar();    return f*x;}inline void calc(void){    sum=0;    for(int i=1;i<=n;i++){        sum+=lala[i];        if(sum>ans)            ans=sum;        if(sum<0)            sum=0;    }}signed main(void){    n=read();    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            array[i][j]=read();    ans=0;    for(int i=1;i<=n;i++){        memset(lala,0,sizeof(lala));        for(int j=i;j<=n;j++){            for(int k=1;k<=n;k++)                lala[k]+=array[j][k];            calc();        }    }    cout<<ans<<endl;    return 0;}

by >o< neighthorn

1 0