博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #587 (Div. 3) F. Wi-Fi(单调队列优化DP)
阅读量:4613 次
发布时间:2019-06-09

本文共 977 字,大约阅读时间需要 3 分钟。

题目:

题意:一排有n个位置,我要让所有点都能联网,我有两种方式联网,第一种,我直接让当前点联网,花费为i,第二种,如果当前点的值为1,代表当前点可以放置一个路由器,范围 [i-k,i+k]都能连上网,花费为i,求最小花费是所有点都能连上网

思路:这个很容易看出是一个DP,我们设立dp[i],为前i个位置都能连上网的最小花费,因为设立一个路由器左右范围都可以联网,所以我们考虑设立路由器的右端点,如果i-k可以设立路由器,我们 dp[i]=min(dp[i],dp[j]+i-k) 但是我们这个j怎么确定呢,肯定是前面的最小值来的,我们在 [i-2*k-1,i] 里面寻找最小值,然后取最优 ,我们可以用单调队列求得最大值,用线段树也是可以的

 

#include
#define maxn 500005#define mod 1000000007using namespace std;typedef long long ll;deque
d;int n,k;char str[maxn];ll dp[maxn];int main(){ scanf("%d%d",&n,&k); scanf("%s",str+1); d.push_back(0);//必须加,因为我们设立第一个路由器的时候可能会用到0,但是第一个位置的值就是1了 for(int i=1;i<=n+k;i++){ dp[i]=dp[i-1]+i;//如果当前这个点用第一种方式联网的话 if(i-k>0&&str[i-k]=='1'){//如果可以用第二种方式联网 while(!d.empty()&&d.front()
=dp[i]) d.pop_back(); d.push_back(i); } ll mx= 0x3f3f3f3f3f3f3f3f; for(int i=n;i<=n+k;i++) mx=min(mx,dp[i]);//取最优 cout<

 

转载于:https://www.cnblogs.com/Lis-/p/11594632.html

你可能感兴趣的文章
[zz]GDB调试精粹及使用实例
查看>>
数据库的创建和删除
查看>>
最简单的三层实例【插入据
查看>>
设计模式学习笔记——Prototype原型模式
查看>>
pom.xml里有红叉报错的解决办法
查看>>
Perl last和next的用法区别
查看>>
Selenium 管理 Cookies
查看>>
exceptionfunction[LeetCode]Permutations
查看>>
Linux(2)_常用命令2
查看>>
自定义分页
查看>>
[转]DELPHI——调试(1)
查看>>
JS秒数转成分秒时间格式
查看>>
xp_cmdshell 命令的开启与关闭,和状态查询
查看>>
Linux sudoers
查看>>
MySQL详解(18)-----------分页方法总结
查看>>
bzoj 4595 激光发生器
查看>>
multi cookie & read bug
查看>>
js时间转换
查看>>
(转载) Android Studio你不知道的调试技巧
查看>>
队列实现霍夫曼树
查看>>