当前位置: 代码迷 >> 综合 >> poj 1050 to the max
  详细解决方案

poj 1050 to the max

热度:35   发布时间:2023-12-14 22:44:21.0

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