題目傳送門
一句話題意
給你乙個數列,每次可以把相鄰兩個數合併,求把這個數列變成不下降序列最少需要的操作次數。
solution
因為洛谷資料比較水,所以這個題目有兩種做法:
1.\(o(n^2)\):直接dp,f[i]表示前 i 個數最少合併的次數。g[i]表示前 i 個數在滿足合併了f[i]次的條件下最後一組的總和最小是多少,sum[i]是字首和。
轉移的話直接列舉i是從前面哪一次轉移過來就行了,\(n^2\)過2e5是真的騷,但是由於數列隨機生成,幾個數之和很容易會超過g[j],所以差不多第二重迴圈只會迴圈幾次,差不多相當於常數,詳情請看**。
2.\(o(n)\):這種方法需要使用單調佇列因為很明顯上一種方法中g陣列具有單調性,所以可以用單調佇列維護。
coding
\(o(n^2)\):
#includeusing namespace std;
const int n = 1e6;
long long p[n],f[n],sum[n],min[n];
int main()
for(int i=1;i<=n;i++)
cout<\(o(n)\):#include#include#include#includeusing namespace std;
typedef long long lol;
lol sum[1000001],pre[1000001],f[1000001];
int q[1000001],head,tail,n;
int main()
head=0;tail=1;
q[0]=0;
for (i=1;i<=n;i++)
cout<}
洛谷 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想把神犇的能力值排列成從左到右單調不減。他每次可以選擇乙個神犇,把他合併到...