P2300 合併神犇 DP

2022-05-11 02:02:14 字數 1186 閱讀 3540

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 均為隨機生成。

這題大家的第一印象大概都是貪心,但是我們的熊本熊在洛谷的題解中給出了反例,而正解是dp。

f[i]表示前i個數最小要花費多少次達到要求,

pre[i]表示前i個數中最大的數,

於是我們就有了下面的**(如有雷同,純屬故意)

#include#include#include#include#include#define il inline

#define ll long long

#define db double

using namespace std;

il ll gl()

while(ch>='0'&&ch<='9')

return x*y;

}ll sum[200045];

ll f[200045];

ll pre[200045];

int main()

for(int i=1;i<=n;i++)

printf("%lld\n",f[n]);

return 0;

}

洛谷 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 ...

洛谷P2300 合併神犇

傳送門啦 分析 剛開始讀完題後感覺很懵,怎麼算都不是3,結果發現題目理解錯了。題目要求的是求乙個不降的序列,不是遞減的 發現自己好傻 看明白題就好做了吧。經典的區間dp題,合併果子大家應該都做過,那個題求乙個代價,這個題換成合併次數了,也差不多。本題要使一段序列合併成不下降序列,因為只能合併相鄰的兩...

DP P2300 合併神犇

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