题意:在一颗森林有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]);
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/10856698.html

Codeforces 319C DP 斜率优化相关推荐

  1. BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )

    既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...

  2. BZOJ 3156: 防御准备( dp + 斜率优化 )

    dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...

  3. 【BZOJ-3156】防御准备 DP + 斜率优化

    3156: 防御准备 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 951  Solved: 446 [Submit][Status][Discus ...

  4. [HNOI2008]玩具装箱toy(dp+斜率优化)

    斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i  ,  f[i]=sum[i]+i ,  c=L+1; 首先我们能 ...

  5. UVAlive 6131 dp+斜率优化

    这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...

  6. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  7. C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )

    链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...

  8. P3994 高速公路 树形DP+斜率优化+二分

    $ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...

  9. FZU - 2302  Necklace (dp+斜率优化)

    I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...

最新文章

  1. 从websphere6.1迁移到weblogic10.3的问题总结
  2. strcpy和strncpy
  3. Libra教程之:运行自定义move modules
  4. 50-overlay 如何实现跨主机通信?
  5. python与用户交互、数据类型
  6. mysql sql实现原理_Mysql的数据库原理
  7. java数组 方法_Java数组的十大方法
  8. Sublime Text 3使用技巧总结--快捷键及常用插件
  9. MySQL online create index实现原理
  10. maven学习七之用户密码修改和添加用户
  11. 机器学习算法之KNN算法
  12. hdu 5514 2015 icpc 沈阳现场 F Frogs
  13. 读论文《Toward Controlled Generation of Text》
  14. vue 自动打开浏览器
  15. A connection attempt failed because the connected party did not properly respond after a period of……
  16. 产品版本、软件版本、文档版本定义
  17. rtl8169网卡驱动
  18. 图神经网络(GNN)简述
  19. 日语学习心得_日语学习资料
  20. Android-RIL流程(呼叫等待)分析

热门文章

  1. 一个页面上有大量的图片,加载很慢,你有哪些方法优化这些图片的加载?
  2. Python在大部分领域都能胜任,为什么很多企业转向了Golang?
  3. 有人说“如今聪明的年轻人上班,愚蠢的年轻人创业!”对此大家怎么看?
  4. 电子密封胶正常固化与非正常固化差别是什么?
  5. 为什么你的店铺不赚钱?
  6. 只要你能想明白一个道理,你也可以在互联网上赚到属于自己的钱
  7. 如何打造个人品牌,把自己“卖”出去?
  8. 反射真的存在性能问题吗?
  9. 再谈重载:一个矢量类
  10. Java中Jsp和Servlet上传和下载文件