DP 斜率 jzoj1257 滑雪場的纜車

2021-10-01 15:16:54 字數 1194 閱讀 8922

因為資料並不是很大所以這是乙個常規dp。處理一下斜率就好了。(並沒有很難?)

科羅拉州的farmer ron打算為他的奶牛們建造乙個滑雪場(雖然需要的設施僅僅是一部纜車)。建造一部纜車,需要從山腳到山頂立若干根柱子,並用鋼絲鏈結它們。你可以認為相對於地面,柱子的高度可以忽略不計。每相鄰兩根柱子間都有鋼絲直接相連。顯然,所有鋼絲的任何一段都不能在地面之下。

為了節省建造的費用,fr希望在工程中修建盡可能少的柱子。他在準備修建纜車的山坡上選定了n(2<=n<=5,000)個兩兩之間水平距離相等的點,並且測量了每個點的高度h(0<=h<=1,000,000,000)。並且,按照****標準,相鄰兩根柱子間的距離不能超過k(1<=k<=n-1)個單位長度。柱子間的鋼絲都是筆直的。

fr希望你幫他計算一下,在滿足下列條件的情況下,他至少要修建多少根柱子:首先,所有的柱子都必須修建在他所選定的點上,且每一段鋼絲都必須高於地面或者正好跟地面相切。相鄰兩根柱子的距離不大於k個單位長度。當然,在第乙個點與最後乙個點上一定都要修建柱子。

input

第1行: 兩個整數 n 和 k,用空格隔開

第2…n+1行: 每行包括乙個正整數,第i+1行的數描述了第i個點的高度

output

第1行: 輸出乙個整數,即fr最少需要修建的柱子的數目

sample input

13 401

0246

8688

91112

sample output
5
f[i]直接為到i點有幾步。

如圖,從第乙個點出發,斜率a>b>c。

b直通。

c,前面b比它大,所以無法連線。

a,斜率比b大,所以可以連線。

#include

#include

#include

using

namespace std;

int n,k,h[

5001

],f[

5001];

double xx,l;

intmain()

}}printf

("%d"

,f[n]);

}

斜率dp模板

維護凸包。我們假設k sum i 那麼j點此時是比i點要更優,但是同時g j,k g i,j sum i 這說明還有k點會比j點更優,同樣排除j點。排除多餘的點,這便是一種優化!接下來看看如何找最優解。設k g x,y 為止,並將d點加入在該位置中。3,求解時候,從隊頭開始,如果已有元素a b c,...

斜率優化 DP

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...

dp斜率優化

我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...