烽火傳遞 單調佇列 DP

2022-05-12 23:08:19 字數 1596 閱讀 9674

描述

烽火台又稱烽燧,是重要的防禦設施,一般建在險要處或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊:夜晚燃燒乾柴,以火光傳遞軍情。在某兩座城市之間有n個烽火台,每個烽火台發出訊號都有一定的代價。為了使情報準確的傳遞,在m個烽火台中至少要有乙個發出訊號。現輸入n、m和每個烽火台發出的訊號的代價,請計算總共最少需要話費多少代價,才能使敵軍來襲之時,情報能在這兩座城市之間準確的傳遞!!!

輸入

第一行有兩個數n,m分別表示n個烽火台,在m個烽火台中至少要有乙個發出訊號。

第二行為n個數,表示每乙個烽火台的代價。

輸出

乙個數,即最小代價。

輸入樣例

5 3

1 2 5 6 2

輸出樣例

4
1<=n,m<=1,000,000

思路:

每連續的m個,至少需要點亮乙個,讓點亮的花費最小。是個dp,由前往後推,f [ i ] 為點亮第 i 時的最小花費

難到我的是,j < i - m ,後來,才明白是為了銜接前段

有時候覺得dp方程很沒道理,卻又理所應當

bf code

#include#includeusing namespace std;

const int mx=1e6+1;

int a[mx],f[mx];

int main()

int mn=0x7fffffff;

for(;j<=i-1;++j)

f[i]=mn+a[i];

} int ans=0x7fffffff;

for(int i=n-m+1;i<=n;++i) ans=min(ans,f[i]);

printf("%d",ans);

return 0;}/*

4 31 2 5 6

6 22 1 2 2 1 2

*/

單調佇列優化

其實優化大多是,減少重複的計算。曾經得到的結論,想辦法繼承到後面的更新中去

而單調佇列,恰好適用於動態移動、固定區間的最值

code

#include#includeusing namespace std;

const int mx=1e6+1;

int a[mx],f[mx],q[mx];

int head=1,tail=0;

int main()

{ int n,m;

scanf("%d%d",&n,&m);

for(int i=1;i<=n;++i) scanf("%d",&a[i]);

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

while(head<=tail && f[i-1]<=f[q[tail]]) tail--;

q[++tail]=i-1;

while(head<=tail && q[head]

單調佇列優化DP 烽火傳遞

烽火台是重要的軍事防禦設施,一般建在交通要道或險要處。一旦有軍情發生,則白天用濃煙,晚上有火光傳遞軍情。在某兩個城市之間有 n 座烽火台,每個烽火台發出訊號都有一定的代價。為了使情報準確傳遞,在連續 m 個烽火台中至少要有乙個發出訊號。現在輸入 n,m 和每個烽火台的代價,請計算在兩城市之間準確傳遞...

DP 單調佇列優化 DP 烽火傳遞

題目 烽火傳遞 做法 動態規劃 單調佇列 狀態表示 f i f i f i 表示前 i ii 個烽火台並點燃第 i ii 個烽火台的最小合法代價。狀態轉移 f i f i f i m in min min,最後掃瞄隊尾 m mm 個 f i f i f i 的值 這樣就可考慮到第 i ii 個不點燃...

烽火傳遞 單調佇列

烽火台又稱烽燧,是重要的軍事防禦設施,一般建在險要或交通要道上。一旦有敵情發生,白天燃燒柴草,通過濃煙表達資訊 夜晚燃燒乾柴,以火光傳遞軍情,在某兩座城市之間有n個烽火台,每個烽火台發出訊號都有一定代價。為了使情報準確地傳遞,在連續m個烽火台中至少要有乙個發出訊號。請計算總共最少花費多少代價,才能使...