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;
}