日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

烽火传递(dp+单调队列)

發布時間:2024/10/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 烽火传递(dp+单调队列) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

第一行:兩個整數 N,M。其中N表示烽火臺的個數, M 表示在連續 m 個烽火臺中至少要有一個發出信號。接下來 N 行,每行一個數 Wi,表示第i個烽火臺發出信號所需代價。

Output

一行,表示答案。

Sample Input

5 3 ?
1 ?
2 ?
5 ?
6 ?
2

Sample Output

4

Data Constraint

對于50%的數據,M≤N≤1,000 。 對于100%的數據,M≤N≤100,000,Wi≤100。
?

分析:

定義f[i]為點燃第i個烽火時前i個烽火滿足條件的最小值。則狀態轉移方程為:

f[i]=min(f[j])+a[i].? 其中 i-m<=j<=i-1;

由此可以得出一般的解法:

#include <iostream>//烽火傳遞問題。 using namespace std; const int inf=1e6+7; int a[inf]; int f[inf]; /*狀態轉移方程 : 定義f[i]: 點燃第i個烽火,并且前i個滿足條件。 則:f[i]=(min)f[j]+a[i] i-m<=j<=i-1; 狀態轉移方程。 */ int main() {int n,m;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);f[0]=0;for(int i=1;i<=m;i++)f[i]=a[i];for(int i=m+1;i<=n;i++){long long themax= ~(1<<31);for(int j=i-m;j<=i-1;j++){if(f[j]<themax)themax=f[j]; }f[i]=themax+a[i];}long long tmax=1<<30;for(int i=n;i>n-m;i--){if(f[i]<tmax)tmax=f[i];} cout<<tmax<<endl;return 0; }

但是從以上程序中也可以看出復雜度為O(n的平方),對應題目而言顯然是不行的,并且注意到是線性結構,求其最小值,所以可以使用單調隊列進行優化。單調隊列我認為和單調函數差不多,不是單調遞增就是單調遞減,只要在入隊的時候保持隊列的單調性就行了,并且彈出比入隊元素大的元素就可以了。

代碼:
?

#include <iostream> //單調隊列+dp using namespace std; const int inf=1e6+7; int a[inf]; int que[inf]; int f[inf]; /* 轉移方程:f[i]=min(f[j])+a[i]; 是從f【i】入隊的吧。 */ int main() {int n, m;int head=1,tail=0;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=0;i<n;i++) //其中的過程,其中的狀態轉移過程。 {while(tail>=head && f[i]<=f[que[tail]])tail--; //d出隊。que[++tail]=i;while(tail>=head && que[head]<i+1-m)head++;f[i+1]=f[ que[head] ]+a[i+1]; }int ans=~(1<<31);for(int i=n;i>n-m;i--) ans=min(f[i],ans);cout<<ans<<endl;return 0; }

?

?

?

?

總結

以上是生活随笔為你收集整理的烽火传递(dp+单调队列)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。