洛谷P2300 合併神犇

2022-04-05 22:35:28 字數 981 閱讀 3547

傳送門啦

分析:

剛開始讀完題後感覺很懵,怎麼算都不是3,結果發現題目理解錯了。題目要求的是求乙個不降的序列,不是遞減的(發現自己好傻)

看明白題就好做了吧。經典的區間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)

#include #include 

#include

#include

using

namespace

std;

const

int maxn = 200005

;inline

intread()

while(ch >= '

0' && ch <= '9')

return x *f;

}int

n,p[maxn];

long

long

f[maxn],sum[maxn],maxp[maxn];

intmain()

inti,j;

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

printf(

"%lld

",f[n]);

return0;

}

洛谷 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 合併神犇 DP

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

洛谷2300 合併神犇

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