题意:在一颗森林有n颗数,编号从1到n,第i棵树高度是a[i]。有一个伐木工想要砍伐这片森林,它的电锯每次可以将树的高度减少1,然后就必须要充电,充电的代价是他已经砍倒的树种编号最大的那颗树的代价(b[i]),问他砍完这片森林的最小代价。(a严格单增,b严格单减,a[1] = 1, b[n] = 0,初始电锯充满电)。

思路:因为b[n]恒等于0,所以题目实际上是花费最小的代价砍倒第n棵树,所以我们可以列出dp方程:设dp[i]是砍倒第i棵树并给电锯充满电的最小代价,那么dp[i] = min(dp[j] + (a[i] - 1) * b[j]) + b[i],这样转移是O(n ^ 2)的,我们考虑优化这个方程。我们把dp方程展开,dp[i] = dp[j] + (a[i] - 1) * b[j] + b[i],移项得:dp[j] = (1 - a[i]) * b[j] + dp[i] - b[i], 我们把它看成一条斜率是(1 - a[i]),截距是dp[i] + b[i]的直线,当截距最小的时候就找到了dp[i]的最小值。我们用单调队列来维护一个下凸壳,维护过程分为3步:1,由于1 - a[i]是单调递减的,所以保证队头的斜率要大于1 - a[i]。2:此时队头就是最优策略。3:将i加入队尾,并维护凸壳。

代码:

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 100010;
LL dp[maxn], a[maxn], b[maxn], q[maxn * 2];
bool cmp(int x, int y, int z) {
return (long double)dp[x] - dp[y] < (long double)(1 - a[z]) * (b[x] - b[y]);
}
bool cmp1(int x, int y, int z) {
return (long double) (dp[x] - dp[y]) * (b[z] - b[y]) >= (long double)(b[x] - b[y]) * (dp[z] - dp[y]);
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
for (int i = 1; i <= n; i++) {
scanf("%lld", &b[i]);
}
int l = 1, r = 1;
q[1] = 1;
dp[1] = b[1];
for (int i = 2; i <= n; i++) {
while(l < r && cmp(q[l + 1], q[l], i)) {
l++;
}
dp[i] = dp[q[l]] + b[i] + (a[i] - 1) * b[q[l]];
while(l < r && cmp1(q[r - 1], q[r], i))
r--;
q[++r] = i;
}
printf("%lld\n", dp[n]);
}

  

Codeforces 319C DP 斜率优化的更多相关文章

  1. 【BZOJ-4518】征途 DP + 斜率优化

    4518: [Sdoi2016]征途 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 230  Solved: 156[Submit][Status][ ...

  2. 【BZOJ-3437】小P的牧场 DP + 斜率优化

    3437: 小P的牧场 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 705  Solved: 404[Submit][Status][Discuss ...

  3. 【BZOJ-1010】玩具装箱toy DP + 斜率优化

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 8432  Solved: 3338[Submit][St ...

  4. 【BZOJ】1096: [ZJOI2007]仓库建设(dp+斜率优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1096 首先得到dp方程(我竟然自己都每推出了QAQ)$$d[i]=min\{d[j]+cost(j+ ...

  5. BZOJ 1096: [ZJOI2007]仓库建设(DP+斜率优化)

    [ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在 ...

  6. 学渣乱搞系列之dp斜率优化

    学渣乱搞系列之dp斜率优化 By 狂徒归来 貌似dp的斜率优化一直很难搞啊,尤其是像我这种数学很挫的学渣,压根不懂什么凸包,什么上凸下凸的,哎...说多了都是泪,跟wdd讨论了下,得出一些结论.本文很 ...

  7. DP斜率优化总结

    目录 DP斜率优化总结 任务安排1 任务计划2 任务安排3 百日旅行 DP斜率优化总结 任务安排1 首先引入一道题,先\(O(N^2)\)做法:分别预处理出\(T_i,C_i\)前缀和\(t[i],c ...

  8. HDU 3507 [Print Article]DP斜率优化

    题目大意 给定一个长度为\(n(n \leqslant 500000)\)的数列,将其分割为连续的若干份,使得 $ \sum ((\sum_{i=j}^kC_i) +M) $ 最小.其中\(C_i\) ...

  9. dp斜率优化

    算法-dp斜率优化 前置知识: 凸包 斜率优化很玄学,凭空讲怎么也讲不好,所以放例题. [APIO2014]序列分割 [APIO2014]序列分割 给你一个长度为 \(n\) 的序列 \(a_1,a_ ...

随机推荐

  1. JS设置首字母大写算法

    返回一个字符串,确保字符串的每个单词首字母都大写,其余部分小写. 像'the'和'of'这样的连接符同理. function titleCase(str) { //把字符串所有的字母变为小写,并根据空 ...

  2. java “+”运算

    /* 四则运算中加好“+”有常见的三种用法 1.对于数值来说,那就是加法 2.对于字符char来说,在计算之前char会被提升成为int 然后在计算 3.对于字符串String(首字母大写,并不是关键 ...

  3. mysql-alter语句常用操作

    删除列 alter table table-name drop col-name 增加列(多列) alter table table-name add col-name col-type commen ...

  4. jquey弹出框demo

    默认 $('#btn-01').click(function(){ $.dialog({ contentHtml : '<p>我是默认弹出对话框示例展示.我只是用来占位的内容展示,仅仅用来 ...

  5. linux 出现 -bash-4.2# 问题的解决方法

    1.在根目录创建 /root 目录 mkdir /root 2. 复制 .bashrc  以及 .bash_profile俩个文件到root目录下 cp /etc/skel/.bashrc /root ...

  6. jquery 下拉框左右选择

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  7. iSkysoft iMedia Converter Deluxe for Mac的使用方法

    我们电脑上的播放器大多数的播放格式都比较少,所以在播放其它格式的时候容易出错,不能兼容其它的视频格式.今天小编要给大家推荐一种软件,iSkysoft iMedia Converter Deluxe就是 ...

  8. Window01

    1 <script src="~/jquery-easyui-1.5.5.2/jquery.min.js"></script> <link href= ...

  9. 06-图2 Saving James Bond - Easy Version(25 分)

    This time let us consider the situation in the movie "Live and Let Die" in which James Bon ...

  10. SPOJ_QTREE系列题解

    QTREE4 #pragma comment(linker, "/STACK:102400000,102400000") //#include<bits/stdc++.h&g ...