这道题是一道dp
我们首先可以看一下在1维中的情况:最大连续子序列和
#include<cstring>
#include<cstdio>
using namespace std;
int a[105][105];
int n,ans,sum;
int main()
{
freopen("tothemax.in","r",stdin);
scanf("%d",&n);
//printf("%d\n",n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int t;
scanf("%d",&t);
//printf("%d ",t);
a[i][j]=a[i-1][j]+t;//前缀
}
}
for(int i=1;i<=n;i++)//开始
{
for(int j=i;j<=n;j++)//结束
{
sum=0;
for(int k=1;k<=n;k++)
{
int t=a[j][k]-a[i-1][k];//前缀和相减算出这一段的和
sum+=t;
if(sum<0) sum=0;
if(sum>ans) ans=sum;
}
}
}
printf("%d\n",ans);
return 0;
}
int maxSubSeq(int[] ary)
{
int maxsum=0;
int localSum=0;
for (int i=0;i<ary.length;i++)
{
localSum+=ary[i];
if(localSum>maxsum) maxsum= localSum;
else if(localSum < 0) localSum=0;
}
return maxsum;
}
我们再回到这道题 youtube讲解
我们只需要枚举列(行),然后把所选择的这几列压缩成一个1位数组,把每一段的和压到一个数组里