题意:传送门
题解:对于最大子段和的做法,设置一个变量
t
m
p
tmp
tmp,每次新加进来一个数,如果和
t
m
p
tmp
tmp相加起来
>
0
>0
>0,那么加进去,如果
<
=
0
<=0
<=0,那么
t
m
p
=
0
tmp=0
tmp=0,根据这个做法拓展到最大子矩阵和,可以枚举最大子矩阵的高和低,然后每次进行
O
(
n
)
O(n)
O(n)维护,最终复杂度由
O
(
n
4
)
−
>
O
(
n
3
)
O(n^4)->O(n^3)
O(n4)−>O(n3)
附上代码:
#include<iostream>
using namespace std;
const int N=1e2+5;
int n,g[N][N],t[N][N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
t[i][j]=g[i][j]+t[i-1][j];
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int tmp=0;
for(int k=1;k<=n;k++){
if(t[j][k]-t[i-1][k]+tmp>0){
tmp+=t[j][k]-t[i-1][k];
}else{
tmp=0;
}
ans=max(ans,tmp);
}
}
}
cout<<ans<<endl;
return 0;
}