子段和会了, 这题就会了, 子段和的思想是dp, 然后网上套一层,枚举多行相加的和, 自己dp太弱, 看着别人的代码写了 保存一下。
自己代码写的比较搓, 存的时候放弃0下标的存储是即好的, 否则就得像我这样套这么多if判断。
#include<stdio.h>
#include<string.h>
int main()
{
int n,i,j,k;
int a[101][101];
int comb[101][101];
int dp[101];
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==0){
comb[i][j]=a[i][j];
}
else{
comb[i][j]=comb[i-1][j]+a[i][j];
}
}
int maxSum=comb[0][0];
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
if(i==0) dp[0]=comb[j][0];
else dp[0]=comb[j][0]-comb[i-1][0];
if(dp[0]>maxSum) maxSum=dp[0];
for(k=1;k<n;k++)
{
if(dp[k-1]>0){
if(i==0) dp[k]=dp[k-1]+comb[j][k];
else dp[k]=dp[k-1]+comb[j][k]-comb[i-1][k];
}
else {
if(i==0) dp[k]=comb[j][k];
else dp[k]=comb[j][k]-comb[i-1][k];
}
if(dp[k]>maxSum) maxSum=dp[k];
}
}
}
printf("%d\n",maxSum);
}
return 0;
}