qwertyxk | 1050 | Accepted | 272K | 16MS | C++ | 618B | 2013-01-13 12:00:27 |
利用以前做连续序列相加的思想,简化题目,把每一列的数行到行的和列出,得到相加结果的所有情况
在每种情况下把这些数就看成一行数,然后找这行数的连续相加最大和即可
用到的即是动规思想
max[i]=max{0,max[i-1]}+a[i]
在这种思想下,运行时间复杂度为O(n3)
#include<stdio.h>
int f[105][105],dp[105][105];
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
int i,j,k,p,sum,max=-99999999;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&f[i][j]);
for(i=0;i<N;i++)
for(j=1;j<N;j++)
{
dp[i][0]=f[0][i];
dp[i][j]=dp[i][j-1]+f[j][i];
}
for(i=1;i<N;i++)
{
for(j=i;j<N;j++)
{
p=dp[0][j]-dp[0][i-1];
sum=p;
for(k=1;k<N;k++)
{
if(sum<0)
sum=0;
sum+=dp[k][j]-dp[k][i-1];
if(sum>p)
p=sum;
}
if(p>max)
max=p;
}
}
printf("%d\n",max);
}
return 0;
}