DP P2300 合併神犇

2022-03-04 21:32:50 字數 1302 閱讀 6708

loidc來到了noi的賽場上,他在那裡看到了好多神犇。

神犇們現在正排成一排在刷題。每個神犇都有乙個能力值p[i]。loidc認為坐在附近的金牌爺能力參差不齊非常難受。於是loidc便想方設法對神犇們進行人道主義合併。

loidc想把神犇的能力值排列成從左到右單調不減。他每次可以選擇乙個神犇,把他合併到兩側相鄰的神犇上。合併後的新神犇能力值是以前兩位犇的能力值之和。每次合併完成後,被合併的兩個神犇就會消失。合併後的新神犇不能再分開(萬一他倆有女朋友咋辦)因此每次合併後神犇的總數會減1.

loidc想知道,想治好他的強迫症需要合併多少次

輸入格式:

第一行乙個整數 n。

第二行 n 個整數,第 i 個整數表示 p[i]。

輸出格式:

loidc需要合併的次數

輸入樣例#1:

8

1 9 9 4 1 2 2 9

輸出樣例#1:

3

對於 50%的資料,0< n <=5000。

對於 100%的資料,0< n <=200000,0< p[i] <=2147483647,p 均為隨機生成。

solution:

好久沒寫dp了啊,於是寫一發dp。

本題要使一段序列合併成不下降序列,因為只能合併相鄰的兩個數,所以合併後的乙個數必定是由原版序列中的一段進行數次合併得到的。考慮簡單的貪心思路,對於第乙個數,每次不停加入乙個數直到它們的和大於第乙個數停止,繼續此操作,直到結束,但是這樣顯然是錯誤的,因為前面滿足了條件不一定後面會最優(很簡單思考懶的舉例了)。由貪心思路引申到dp,因為是一段合併,考慮到字首和sum[i],我們令f[i]表示到了第i個數為止所合併的次數,用乙個輔助陣列maxp[i]表示到了i為止合併後最大的乙個數,於是得到狀態轉移方程:if(sum[i]-sum[j]>=maxp[j])f[i]=f[j]+j-i-1(其中i>j)

**:

1 #include2

#define ll long long

3using

namespace

std;

4 inline int

gi()

512 ll n,sum[200005],f[200005],maxp[200005

];13

intmain()

1423 cout<24return0;

25 }

洛谷2300 合併神犇

題目傳送門 一句話題意 給你乙個數列,每次可以把相鄰兩個數合併,求把這個數列變成不下降序列最少需要的操作次數。solution 因為洛谷資料比較水,所以這個題目有兩種做法 1.o n 2 直接dp,f i 表示前 i 個數最少合併的次數。g i 表示前 i 個數在滿足合併了f i 次的條件下最後一組...

P2300 合併神犇 DP

loidc來到了noi的賽場上,他在那裡看到了好多神犇。神犇們現在正排成一排在刷題。每個神犇都有乙個能力值p i loidc認為坐在附近的金牌爺能力參差不齊非常難受。於是loidc便想方設法對神犇們進行人道主義合併。loidc想把神犇的能力值排列成從左到右單調不減。他每次可以選擇乙個神犇,把他合併到...

洛谷 P2300 合併神犇

洛谷 聽說這題可以 n 2 水過去,不過這裡介紹一種 o n 的做法。f i 為第 1 i 位合併的次數。pre i 為第 1 i 位最末尾的數。j 為滿足 sum i sum j pre j 的最大數。所以很好推出 f i f j i j 1 pre i sum i sum j 顯然 pre i ...