題意:給你一排\(n\)個塔,每個塔有一定高度,需要將塔划分為\(k\)個區間,每個區間的收益為區間最大值與最小值之差,求\(k=1,2,3..n\)時的最大收益。
第一反應是倒過來搞,\(k=n\)時答案為0,把區間的拆分改為區間的合並。
但極差太難以遞推,賽場上最終沒有想出正解。
事后翻知乎,看到了大佬的一個很簡單的思路:
B題 dp
直接dp,極差不方便轉移
把差轉化成 \(=a[i]-a[j]\) (\(i,j\)為區間內任意值)
不改變答案顯然,
?滿頭問號?為啥可以直接把極差改成任意的 \(a[i]-a[j]\) 了?
仔細想一下,每個區間任取兩個數相減,得到的結果一定小於極差。
那么考慮所有取法,得到結果的最大值和只取極差是一樣的。
我們取所有\(a[i]\)的權重為1,\(a[j]\)的權重為-1,其余數權重為0,每個區間取一對±1即可
用\(dp[i,j,k]\)表示前\(i\)個數,已經取了\(j\)個區間(即\(j\)對\(±1\));
\(k=0/1/-1\),表示下一個區間已經包含了\(k\)
可以列出狀態轉移方程:
\[dp[i,j,0]=max \left\{ \begin{aligned} &dp[i-1,j,0]\\ &dp[i-1,j-1,-1]+a[i]\\ &dp[i-1,j-1,1]-a[i] \end{aligned} \right. \]
\[dp[i,j,1]=max \left\{ \begin{aligned} &dp[i-1,j,1]\\ &dp[i-1,j,0]+a[i]\\ \end{aligned} \right. \]
\[dp[i,j,-1]=max \left\{ \begin{aligned} &dp[i-1,j,-1]\\ &dp[i-1,j,0]-a[i]\\ \end{aligned} \right. \]
PS:因為沒有補題通道,這篇只交流思路。如果有錯誤懇請指出。