洛谷P1970 花匠 線性dp

2021-09-27 07:01:48 字數 1201 閱讀 5291

給出n≤1

e5

n\leq1e5

n≤1e

5個數,滿足對於所有的g2i

>g2

i−1,

g2

i>g2

i+

1g_>g_,g_>g_

g2i​

>g2

i−1​

,g2i

​>g2

i+1​

或者g 2i

i−1,

g2

i

i+

1g_g2

i​i−1​

,g2i

​i+1​

。對理解dp是乙個不錯的題,dp重在設計出來的狀態是乙個可以轉化為子問題的狀態,然後考慮對子狀態的轉移。

記錄f i,

0∣1f_

fi,0∣1

​分別表示到i

ii這個位置,波峰|波谷的最大保留值。

轉移的時候考慮前一位,以波谷為例,若a

i

−1

a_ai

​−1​,有fi,

1=fi

−1,0

+1

f_=f_+1

fi,1​=

fi−1

,0​+

1。否則fi,

0=fi

−1,0

f_=f_

fi,0​=

fi−1

,0​。

為什麼只需要考慮前一位呢,其實就如這個轉移式告訴我們,如果這個點大於前面乙個點,那麼它無法成為波谷,只能成為波峰,而作為波峰答案自然是不變的,而波峰我們確實是希望它越大越好。所以這一位是最好的,之後的轉移就不用再去考慮前面的位置了。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=1e5+7;

int a[n];

int f[n][2]; // 0 represents decrease / 1 represents increase

int main()

printf("%d\n",max(f[n][0],f[n][1]));

return 0;

}

洛谷 P1970 花匠 線性dp

花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h nh1 h2 hn 設當一部分花被移走後,剩下的花的高度依...

洛谷 P1970 花匠 DP

題目 普通的dp,f i 0 1 表示 i 處處於較小或較大的長度 注意 1.樹狀陣列向後 query 時不能有0,所以讀入的 h i 都 1 2.可能有相同的高度!所以 query 時注意 1,1。如下 include include include include using namespace...

洛谷p1970花匠

原題 一共兩種情況,分別畫圖模擬一下就可以很快想出思路,線性dp分情況討論 波峰與波谷交替出現,比如現在正在求f i 那麼尋找i之前比他矮 那麼他就是波峰 或比他高 他是波谷 取最大值存入,並且記錄他是波谷還是波峰。不難實現,看懂思路就好。include include include includ...