給出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 ii−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。 為什麼只需要考慮前一位呢,其實就如這個轉移式告訴我們,如果這個點大於前面乙個點,那麼它無法成為波谷,只能成為波峰,而作為波峰答案自然是不變的,而波峰我們確實是希望它越大越好。所以這一位是最好的,之後的轉移就不用再去考慮前面的位置了。 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; } 花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h nh1 h2 hn 設當一部分花被移走後,剩下的花的高度依... 題目 普通的dp,f i 0 1 表示 i 處處於較小或較大的長度 注意 1.樹狀陣列向後 query 時不能有0,所以讀入的 h i 都 1 2.可能有相同的高度!所以 query 時注意 1,1。如下 include include include include using namespace... 原題 一共兩種情況,分別畫圖模擬一下就可以很快想出思路,線性dp分情況討論 波峰與波谷交替出現,比如現在正在求f i 那麼尋找i之前比他矮 那麼他就是波峰 或比他高 他是波谷 取最大值存入,並且記錄他是波谷還是波峰。不難實現,看懂思路就好。include include include includ...#includeusing namespace std;
洛谷 P1970 花匠 線性dp
洛谷 P1970 花匠 DP
洛谷p1970花匠