博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #189 (Div. 1) C - Kalila and Dimna in the Logging Industry 斜率优化dp
阅读量:5041 次
发布时间:2019-06-12

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

很容易能得到状态转移方程 dp[ i ] = min( dp[ j ] + b[ j ] * a[ i ] ), 然后斜率优化一下。

一直以为炸精度了, 忽然发现手贱把while 写成了if 。。。。

#include
#define LL long long#define fi first#define se second#define mk make_pair#define PLL pair
#define PLI pair
#define PII pair
#define SZ(x) ((int)x.size())#define ull unsigned long longusing namespace std;const int N = 4e5 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1e9 + 7;const double eps = 1e-8;int n, que[N], head, rear;LL a[N], b[N], dp[N];double calc(int k, int j) { return 1.0 * (dp[j] - dp[k]) * (b[k] - b[j]);}int main() { 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]); dp[1] = 0; head = 1, rear = 0; que[++rear] = 1; for(int i = 2; i <= n; i++) { while(rear - head + 1 >= 2 && calc(que[head], que[head + 1]) < a[i]) head++; dp[i] = dp[que[head]] + b[que[head]] * a[i]; while(rear - head + 1 >= 2 && calc(que[rear-1], que[rear]) >= calc(que[rear], i)) rear--; que[++rear] = i; } printf("%lld\n", dp[n]); return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/10351227.html

你可能感兴趣的文章
OGRE 源码编译方法
查看>>
上周热点回顾(10.20-10.26)
查看>>
C#正则表达式引发的CPU跑高问题以及解决方法
查看>>
云计算之路-阿里云上:“黑色30秒”走了,“黑色1秒”来了,真相也许大白了...
查看>>
APScheduler调度器
查看>>
设计模式——原型模式
查看>>
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>
数据库连接
查看>>
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>
第四天 selenium的安装及使用
查看>>
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>