本文主要是介绍蓝桥集训之烽火传递,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
蓝桥集训之烽火传递
-
核心思想:单调队列优化dp
- f[i] = min(f[i-m] - f[i-1]) + w[i] dp
- 求以前m-1个数中最小值 可以用单调队列优化
- 求完f[i]就判断放入单调队列
-
#include<iostream>#include<cstring>using namespace std;const int N = 200010;int w[N],f[N],q[N];int n,m;int main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>w[i];int hh=0,tt=0;for(int i=1;i<=n;i++){if(q[hh] < i-m) hh++;f[i] = f[q[hh]] + w[i]; //dpwhile(hh<=tt && f[q[tt]] >= f[i]) tt--; //f[j]更优q[++tt] = i;}int res=1e8;for(int i=n-m+1;i<=n;i++) //求后m种方案{res = min(res,f[i]);}cout<<res<<endl;return 0;}
这篇关于蓝桥集训之烽火传递的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!