题目大意:

1.给出长度为n的数组,要求每m个连续的元素之间必须选一个值作为代价,求该数组的最小代价。

题解思路:

1.显然是线性dp,dp【i】表示选择第 i 个元素时的最小总代价。很明显状态转移方程为 dp[i] = min(dp[j]) + a[i]。(i - m <= j <= i - 1)。但是在求min(dp[j])的时候,我们需要遍历一遍长度为m大小的区间,m极限与n同大。时间负责度0(N^2)。显然会超时。

2.我们需要用单调队列来维护长度为m大小区间内的最小值,队头即为最小值,直接O(1)得到min(dp[j]),就可以避免超时。

代码如下:

 #include<stdio.h>
#include<deque>
#include<algorithm>
const int MAXN = 2e5 + ;
using namespace std;
const int inf = 0x3f3f3f3f; int n, m, a[MAXN];
int dp[MAXN]; //表示第 i 个烽火台放置烽火时的最小总代价
deque<int> Q; int main()
{
scanf("%d%d",&n, &m);
for(int i = ; i <= n; i ++)
scanf("%d", &a[i]);
for(int i = ; i <= m; i ++) //dp以及单调队列初始化
{
dp[i] = a[i];
while(!Q.empty())
{
if(dp[i] < dp[Q.back()])//保证队头保存的是dp值最小的下标 队头到队尾单调递增
Q.pop_back();
else
break;
}
Q.push_back(i);
}
for(int i = m + ; i <= n; i ++)
{
while(!Q.empty())
{
if(i - m > Q.front()) //保证队头位于枚举范围内,即是在 [i - m, i - 1]范围内
Q.pop_front();
else
break;
}
dp[i] = dp[Q.front()] + a[i];
while(!Q.empty())
{
if(dp[i] < dp[Q.back()])
Q.pop_back();
else
break;
}
Q.push_back(i);
}
int ans = inf;
for(int i = n; i > n - m; i --)
ans = min(ans, dp[i]);
printf("%d\n", ans);
return ;
}
/*
5 3
1 2 5 6 2 4
*/

烽火传递【单调队列优化dp】的更多相关文章

  1. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  2. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  3. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  4. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  5. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  6. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

  7. 【单调队列优化dp】 分组

    [单调队列优化dp] 分组 >>>>题目 [题目] 给定一行n个非负整数,现在你可以选择其中若干个数,但不能有连续k个数被选择.你的任务是使得选出的数字的和最大 [输入格式] ...

  8. [小明打联盟][斜率/单调队列 优化dp][背包]

    链接:https://ac.nowcoder.com/acm/problem/14553来源:牛客网 题目描述 小明很喜欢打游戏,现在已知一个新英雄即将推出,他同样拥有四个技能,其中三个小技能的释放时 ...

  9. 单调队列以及单调队列优化DP

    单调队列定义: 其实单调队列就是一种队列内的元素有单调性的队列,因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的. 单调队列的一般应用: 1.维护区间最值 2 ...

  10. BZOJ1791[Ioi2008]Island 岛屿 ——基环森林直径和+单调队列优化DP+树形DP

    题目描述 你将要游览一个有N个岛屿的公园.从每一个岛i出发,只建造一座桥.桥的长度以Li表示.公园内总共有N座桥.尽管每座桥由一个岛连到另一个岛,但每座桥均可以双向行走.同时,每一对这样的岛屿,都有一 ...

随机推荐

  1. [golang] 抓包注入分析

    视频信息 Packet Capture, Analysis, and Injection with Goby John Leonat GopherCon 2016 https://www.youtub ...

  2. AtCoder Grand Contest 020 (AGC020) E - Encoding Subsets 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/AGC020E.html 前言 真 \(\cdot\) 信仰型动态规划 题解 我们可以采用信仰型动态规划解决此题. 设 \(dp[ ...

  3. Win7如何设置怎样在局域网内共享打印机

    首先进入桌面,点击开始按钮,然后打开控制面板 2 在控制面板设置界面,找到“管理工具”选项 3 接着打开“计算机管理”   选择“本地用户和组”的Guest账户   确保Guest账户被禁用   下面 ...

  4. python中的__init__方法

    init()方法意义重大的原因有两个.第一个原因是在对象生命周期中初始化是最重要的一步:每个对象必须正确初始化后才能正常工作.第二个原因是init()参数值可以有多种形式. __init__方法使用 ...

  5. Android 9.0 Http不能访问网络

    最近在做公司产品,一期完成,打包给测试,然后....一台手机连服务器都访问不了看日志如下: UnityWebRequest返回code:0,显示Unknow error 服务器接口是http://非域 ...

  6. js的prototype理解

    转载:https://www.cnblogs.com/douyage/p/8630529.html 在典型的面向对象的语言中,如java,都存在类(class)的概念,类就是对象的模板,对象就是类的实 ...

  7. AOSP---"Android Open-Source Project"

    定义 编辑 "Android Open-Source Project"的缩写 中文意为"Android 开放源代码项目" 内容 编辑 在Android Open ...

  8. 一个机器绑两个IP可能存在的问题

    1.同一网段两个ip 无法绑到一个机器上. 因为会生成两条该网段路由,两个路由用于同网段报文相应,而实际ip选路时只会选择其中一条路由(估计会选择前面那一条)从一个网卡走.这样不管哪个网卡来的局域网内 ...

  9. Faster async functions and promises

    https://v8.dev/blog/fast-async async function computeAnswer() { return 42;}undefinedconst p = comput ...

  10. 5+app uni-app flutter

    5+app uni-app flutter三者区别是什么? - 知乎 https://www.zhihu.com/question/295107584/answer/525442299 崔红保 DCl ...