Codeforces 319C DP 斜率优化
题意:在一颗森林有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 斜率优化相关推荐
- BZOJ 1597: [Usaco2008 Mar]土地购买( dp + 斜率优化 )
既然每块都要买, 那么一块土地被另一块包含就可以不考虑. 先按长排序, 去掉不考虑的土地, 剩下的土地长x递增, 宽y递减 dp(v) = min{ dp(p)+xv*yp+1 } 假设dp(v)由i ...
- BZOJ 3156: 防御准备( dp + 斜率优化 )
dp(i)表示处理完[i,n]且i是放守卫塔的最小费用. dp(i) = min{dp(j) + (j-i)(j-i-1)/2}+costi(i<j≤N) 然后斜率优化 ------------ ...
- 【BZOJ-3156】防御准备 DP + 斜率优化
3156: 防御准备 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 951 Solved: 446 [Submit][Status][Discus ...
- [HNOI2008]玩具装箱toy(dp+斜率优化)
斜率优化问题一般都是决策单调问题.对于这题能够证明单调决策. 令sum[i]=sigma(c [k] ) 1<=k<=i , f[i]=sum[i]+i , c=L+1; 首先我们能 ...
- UVAlive 6131 dp+斜率优化
这道题和06年论文<从一类单调性问题看算法的优化>第一道例题很相似. 题意:给出n个矿的重量和位置,这些矿石只能从上往下运送,现在要在这些地方建造m个heap,要使得,sigma距离*重量 ...
- hdu 3507 Print Article(dp+斜率优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...
- C++剑指offer:解题报告之DP优化学习记 (二) ——浅论DP斜率优化 (Print Article 【HDU - 3507】 )
链接:https://share.weiyun.com/5LzbzAc 目录 前言 斜率优化前期准备 1.从状态转移方程出发 2.推理状态转移方程 对结论的进一步推导 干货!综合结论 判断斜率大小的方 ...
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- FZU - 2302 Necklace (dp+斜率优化)
I - Necklace FZU - 2302 题目大意:给出一个环每一段的价值为区间和的平方,求将环断成k断的最小价值之和. 解题思路:容易想到n^4的dp 首先断环成链,将数组复制一遍. 用dp[ ...
最新文章
- 从websphere6.1迁移到weblogic10.3的问题总结
- strcpy和strncpy
- Libra教程之:运行自定义move modules
- 50-overlay 如何实现跨主机通信?
- python与用户交互、数据类型
- mysql sql实现原理_Mysql的数据库原理
- java数组 方法_Java数组的十大方法
- Sublime Text 3使用技巧总结--快捷键及常用插件
- MySQL online create index实现原理
- maven学习七之用户密码修改和添加用户
- 机器学习算法之KNN算法
- hdu 5514 2015 icpc 沈阳现场 F Frogs
- 读论文《Toward Controlled Generation of Text》
- vue 自动打开浏览器
- A connection attempt failed because the connected party did not properly respond after a period of……
- 产品版本、软件版本、文档版本定义
- rtl8169网卡驱动
- 图神经网络(GNN)简述
- 日语学习心得_日语学习资料
- Android-RIL流程(呼叫等待)分析