题目大意:
最大子矩阵和
分析:
因为刷的是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