DP算法入門(3)——最大子段和

  • 令b[j]表示以位置 j 爲終點的所有子區間中和最大的一個
  • 子問題:如j爲終點的最大子區間包含了位置j-1,則以j-1爲終點的最大子區間必然包括在其中
  • 如果b[j-1] >0, 那麼顯然b[j] = b[j-1] + a[j],用之前最大的一個加上a[j]即可,因爲a[j]必須包含
  • 如果b[j-1]<=0,那麼b[j] = a[j] ,因爲既然最大,前面的負數必然不能使你更大
int max = 0;
int b[n+1];
int start = 0;
int end = 0;
memset(b,0,n+1);
for(int i = 1; i <= n; ++i)
 {
   if(b[i-1]>0)
   {
     b[i] = b[i-1]+a[i];
   }else{
     b[i] = a[i];
   }
   if(b[i]>max)
     max = b[i];
 }

練習:POJ1050
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章