1. 程式人生 > >51nod1254 最大子段和 V2

51nod1254 最大子段和 V2

i+1 交換操作 最大子段和 body OS 另一個 體會 思路 處理

想了很久才體會出這道題的奧妙,愛恨交加的復雜情感。

思路:

題目要求必須做交換操作,那麽就有以下三種情況:

  • 1.被交換的兩個數都在最大子段中;
  • 2.被交換的兩個數都不在最大子段中;
  • 3.被交換的兩個數只有一個在最大子段中。

顯然,1、2兩種情況與交換與否無關,即只有情況3才體現出了交換的價值。

那麽對於情況3我們又可以分兩類:

  • a.另一個被交換數在子段的左側;
  • b.另一個被交換數在子段的右側。

僅分析a類情況,b類情況相似。那麽我們需要從左邊找一個最大的數交換到子段中,設此最大的數是a[k],交換到a[i]的位置(即k<i)。

同時我們要求出(以a[i-1]結尾的、a[i]左側的最大子段和)以及(以a[i+1]為首的、a[i]右側的最大子段和)。

求解(以a[i-1]結尾的、a[i]左側的最大子段和):可在從左至右遍歷a[i]的同時找出a[k]和左側最大子段和,若子段和小於0則舍去;

求解(以a[i+1]為首的、a[i]右側的最大子段和):可以預先處理,從右至左求最大子段和。

問題迎刃而解。

51nod1254 最大子段和 V2