1.最大子段和的优化
我们可以看出来,一个数,要不就是一段序列的结尾,要不就当开头,如果前面的成一个下降趋势的话,就可以得出当前的和前面的结合肯定是劣于自己当头,所以好理解的方式就是开一个数组,记录到 i 的最大子串和,就可以顺理成章的转移了
int n,ans=-1e9;
int f[Maxn];
int main()
{
n=read();
for(int i=1,t;i<=n;i++)
{
t=read();
f[i]=max(t,f[i-1]+t);
ans=max(ans,f[i]);
}
printf("%d",ans);
return 0;
}
2.最大子矩阵的优化,就是把一列的数字看作一个点,然后一列一列的求最大子串和。
注意要另开一个数组记录一下,算的时候可以记录每一列的前缀和
int n,ans;
int a[Maxn][Maxn];
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
for(int j=1,t;j<=n;j++)
{
t=read();
a[i][j]=a[i-1][j]+t;
}
}
for(int i=1;i<=n;i++)
{
for(int k=i;k>=0;k--)
{
int f[Maxn]={0},tmp;
for(int j=1;j<=n;j++)
{
tmp=a[i][j]-a[k][j];
f[j]=max(tmp,f[j-1]+tmp);
ans=max(ans,f[j]);
}
}
}
printf("%d",ans);
return 0;
}