因為資料並不是很大所以這是乙個常規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 output5
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 如果把右邊...