#include<bits/stdc++.h>
using namespace std;
//按列压缩成一位数组,枚举所有的情况((N*(N+1)/2种),然后当成最大连续子序列来求
int sum[110][110],dp[110];//sum[i]是前i行被压缩成的数组,节省计算时间
//(类似要求A[i]到A[j]的和,用S[i]表示A[0]到A[i]的和,这样A[i]到A[j]的和=S[j]-S[i],减少了重复计算)
int ans;
int main(){
int n,t;
scanf("%d",&n);
for(int i=1;i<=n;i++){//i从1开始,是为了枚举时方便 sum[j][k]-sum[i-1][k]
for(int j=1;j<=n;j++){//j从1开始,是为了dp时统一公式 dp[k]=max(dp[k-1]+now,now)
scanf("%d",&t);
sum[i][j]=sum[i-1][j]+t;
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
for(int k=1;k<=n;k++){
int now=sum[j][k]-sum[i-1][k];
dp[k]=max(dp[k-1]+now,now);
ans=max(ans,dp[k]);
}
}
}
printf("%d",ans);
}
POJ最大子矩阵
最新推荐文章于 2022-04-30 18:34:35 发布