在一维情况下最大连续子段和的求法是从左到有顺序扫描数据,以0为边界,当累加和小于0时则重置为0.动态规划的状态转移方程为s=max{si-1+ai,ai},该方程和前面的描述是等价的。本题是对一维最大子段和的扩展,思路是从上到下找出所有的连续行(如第i行到第j行),然后计算每列从第i行到第j行的和,之后对这n个列的和进行一维最大子段和的计算,并找出最大的值。
#include<stdio.h>
#define MAX 101
int main()
{
int n,i,j,k;
int a[MAX][MAX]={0};
int colsum[MAX][MAX]={0};
int max=0,sum;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a[i][j-1]);
colsum[i][j]=colsum[i][j-1]+a[i][j-1];
}
for(i=0;i<n;i++)
for(j=i;j<=n;j++)
{
sum=0;
for(k=0;k<n;k++)
{
sum+=colsum[k][j]-colsum[k][i];
if(sum<0)
sum=0;
else if(sum>max)
max=sum;
}
}
printf("%d\n",max);
return 0;
}