HDU1003 ---最大子序列和 subsequence

来源:互联网 发布:2016nba总决赛每场数据 编辑:程序博客网 时间:2024/05/17 03:43


这里的子序列指连续子序列

算法一。穷举  O(n^2)     序列规模较大时,非常耗时

 max=a[1];for(i=1;i<=size;i++){    sum=0;    for(j=i;j<=size;j++)    {    sum+=a[j];       if(sum>max)       {       max=sum;shou=i;last=j;           }    }} 

算法二。 动态规划   O(n)      一个for循环即可解决

令dp[ j ]表示以 j 为终点的最大子段和。

子问题:要求dp[ j ] ,求出dp[ j-1]即可 ,依此类推,因此只要知道dp[ 1 ] ,就可求出dp[ j ]

                 dp[ j-1] >0  则dp[ j ]=dp[ j-1] + a[ j ]

                 dp[ j-1] <=0  则dp[ j ]=a[ j ]           最大子段和不可能以负数开头

for(j = 1; j <= n; j++) {   if(dp[j-1]>0)   {     dp[j] = dp[j-1]+a[j];   }   else{     dp[j] = a[j];   }   if(dp[j]>max)     max = dp[j]; }
 将该思想用于本题,dp[ j ] 相当于sum

max=-1001;sum=0;shou=last=1; //若max=0 当序列全负时结果不正确(-1000<=ai<=1000)

for(i=1,j=1;i<=w;i++)

{   sum+=a[i];

   if(sum>max)   

 {

max=sum;last=i;shou=j;

  }

if(sum<0)

  {  sum=0;

     j=i+1;                     //和最大的子序列不可能以负数开头,shou向后推进一个

  }

}

还可以用分治法      O(nlogn)

区间【shou,last】的所有可能情况就 3 种:shou在[1,n/2],last在[n/2+1,n]shou,last都在[1,n/2]shou,last都在[n/2+1,n]


	
				
		
原创粉丝点击