hdu3507

题意

给出 N 个数字,输出的时候可以选择连续的输出,每连续输出一串,它的费用是 这串数字和的平方加上一个常数 M。

分析

斜率优化dp,入门题。

参考

参考

得到 dp 方程后,发现是O(n * n)的复杂度,且 n 很大,考虑用斜率优化。

设 s[i] 为 1 到 i 的花费之和。

dp方程:\(dp[i] = dp[j] + (s[i] - s[j])^2 + m ( i > j)\)

如果选 j 比选 k 更优,则有 \(dp[j] + (s[i] - s[j])^2 + m < dp[k] + (s[i] - s[k])^2 + m\)

移项可得, $(dp[j] + s[j]^2 - (dp[k] + s[k]^2)) / (2 * (s[j] - s[k])) < s[i] $

这样形成类似于求斜率的式子。

那么满足这个式子,是由于前提条件:j 比 k 更优,即选 j 花费更少。

令 $ g[j, l] = (dp[l] + s[l]^2 - (dp[j] + s[j]^2)) / (2 * (s[l] - s[j]))$

code

#include<cstdio>
using namespace std;
const int MAXN = 5e5 + 5;
int s[MAXN], q[MAXN], dp[MAXN];
int n, m;
int up(int k, int j) {
return dp[j] + s[j] * s[j] - (dp[k] + s[k] * s[k]);
}
int down(int k, int j) {
return 2 * (s[j] - s[k]);
}
int get(int i, int j) {
return dp[j] + (s[i] - s[j]) * (s[i] - s[j]) + m;
}
int main() {
while(~scanf("%d%d", &n, &m)) {
s[0] = 0;
dp[0] = 0;
for(int i = 1; i <= n; i++) {
scanf("%d", &s[i]);
s[i] += s[i - 1];
}
int head = 0, tail = 0;
q[tail++] = 0;
for(int i = 1; i <= n; i++) {
while(head + 1 < tail && up(q[head], q[head + 1]) <= s[i] * down(q[head], q[head + 1]))
head++;
dp[i] = get(i, q[head]);
// g[k,j] >= g[j,l] (k < j < l) 说明 j 可以舍去
while(head + 1 < tail && up(q[tail - 2], q[tail - 1]) * down(q[tail - 1], i) >= up(q[tail - 1], i) * down(q[tail - 2], q[tail - 1]))
tail--;
q[tail++] = i;
}
printf("%d\n", dp[n]);
}
return 0;
}

hdu3507(初识斜率优化DP)的更多相关文章

  1. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  2. 【hdu3507】Print Article 【斜率优化dp】

    题意 https://cn.vjudge.net/problem/HDU-3507 分析 斜率优化的模板题 #include <cstdio> #include <cstring&g ...

  3. HDU3507 print article【斜率优化dp】

    打印文章 时间限制:9000/3000 MS(Java / Others)内存限制:131072/65536 K(Java / Others) 总共提交:14521已接受提交:4531 问题描述 零有 ...

  4. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  5. bzoj-4518 4518: [Sdoi2016]征途(斜率优化dp)

    题目链接: 4518: [Sdoi2016]征途 Description Pine开始了从S地到T地的征途. 从S地到T地的路可以划分成n段,相邻两段路的分界点设有休息站. Pine计划用m天到达T地 ...

  6. bzoj-1096 1096: [ZJOI2007]仓库建设(斜率优化dp)

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

  7. [BZOJ3156]防御准备(斜率优化DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3156 分析: 简单的斜率优化DP

  8. 【BZOJ-1096】仓库建设 斜率优化DP

    1096: [ZJOI2007]仓库建设 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3719  Solved: 1633[Submit][Stat ...

  9. BZOJ 1010: [HNOI2008]玩具装箱toy 斜率优化DP

    1010: [HNOI2008]玩具装箱toy Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再 ...

随机推荐

  1. 《Cracking the Coding Interview》——第2章:链表——题目2

    2014-03-18 02:24 题目:给定一个单链表,找出倒数第K个节点. 解法:让一个指针先走K步,然后俩指针一起走到尽头.当然也可以先走到尽头数出链表的长度,然后第二次少走K步.其实耗费的工夫是 ...

  2. loadrunner破解出现“license security violation,Operation is not allowed”的错误提示

    1.关闭loadrunner,将破解文件(“lm70.dll”.“mlr5lprg.dll”)放置在LoadRunner\bin下面 2.以管理员身份运行loadrunner,在CONFUGURATI ...

  3. webdriver--设置元素等待

    sleep():脚本执行到某一位置时“睡一会”,再继续执行:参数的单位是s:sleep方法由python的time模块提供,有两种引入和使用方式 import time time.sleep(5) f ...

  4. ADB连接手机遇到的问题:list of devices attached

    今天工作时想尝试一下使用ADB无线连接手机,结果遇到了下面这样的问题,浪费了几十分钟的时间,挺闹心的,因此想分享出来... 首先 第一步:使用USB数据线连接手机,手机弹出选项时,选择仅充电,然后wi ...

  5. 常用模块(random)

    import randomimport string# dt = random.randint(1,2) # 从1-2间取随机数,包括1.2# dt = random.randrange(1,3) # ...

  6. Mysql DISTINCT问题

    问题描述 因为要设计一个数据库表,进行一个倒序去重的操作. 例如: id Name 1 B 2 A 3 A 4 C 5 C 6 B 场景:例如说我们需要得到一个用户的搜索记录,那么肯定不会仅仅根据时间 ...

  7. HDU 4747 Mex ( 线段树好题 + 思路 )

    参考:http://www.cnblogs.com/oyking/p/3323306.html 相当不错的思路,膜拜之~ 个人理解改日补充. #include <cstdio> #incl ...

  8. Spring 学习笔记(五)—— Bean之间的关系、作用域、自动装配

    继承 Spring提供了配置信息的继承机制,可以通过为<bean>元素指定parent值重用已有的<bean>元素的配置信息. <?xml version="1 ...

  9. c#中获得MD5字符串方法

    在用户登录的过程中,我们会遇到要查询对比用户名密码的是否存在或者是否正确,但是数据库中存放的是通过MD5加密的字符串,所有我们可以先把用户输入的用户名或者是密码先转为DM5字符串再跟数据库查出的MD5 ...

  10. 201621123033 《Java程序设计》第9周学习总结

    第九次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 选做:收集你认为有用的代码片段 //stream(),filter(),collect() ...