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. shell脚本批量下载资源并保留路径

    示例资源列表 如url.txt: http://su.bdimg.com/static/superplus/img/logo_white_ee663702.png http://su.bdimg.co ...

  2. 【Matrix Factorization】林轩田机器学习技法

    在NNet这个系列中讲了Matrix Factorization感觉上怪怪的,但是听完第一小节课程就明白了. 林首先介绍了机器学习里面比较困难的一种问题:categorical features 这种 ...

  3. Eclipse 出现“polling news feeds”的解决办法

    小编突然心血来潮,安装了一下Java的环境,eclipse的IDE来写点Java,但是是不是出现以下的弹窗,实在是闹心,后来网上看了前辈们的解决办法,特此记录一下.如有侵权,敬请告知!!! 1. 找到 ...

  4. SPOJ - DQUERY(区间不同数+树状数组)

    链接:SPOJ - DQUERY 题意:求给定区间不同数的个数(不更新). 题解:离线+树状数组. 对所求的所有区间(l, r)根据r从小到大排序.从1-n依次遍历序列数组,在树状数组中不断更新a[i ...

  5. python_ 运算符与分支结构

    # 运算符与分支结构 ### 运算符 - 赋值运算符 - 用'='表示,左边只能是变量. - 算术运算符 - +.-.*:加.减.乘 - /:除法运算,结果是浮点数 - //:除法运算,结果是整数 - ...

  6. Struts2 学习笔记

    1)Strust2是以WebWork为核心,采用拦截器的机制对用户请求进行处理. 2)Struts2框架结构: 3)简单来看整个Struts2的处理过程可以简单的理解为 用户的请求发送给对应的Acti ...

  7. 第二阶段团队冲刺-four

    昨天: 绘制logo. 今天: 用servlet完成名单打印功能. 遇到的问题: servlet中的获得的路径不是想要的.

  8. opencv3.1+cmake+mingw5.3+QT5编译

    太不容易了! 想要访问opencv的官网貌似要FQ才行.下载了opencv3.2版本,发现cmake在download opencv_ffmpeg.dll的地方超时了. 于是搜索一番,发现很多编译op ...

  9. 浅谈数据库系统中的cache(转)

    http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转)   Cache和Buffer是两个不同 ...

  10. java值转递?引用传递?

    值传递是传递的是原值的副本,引用传递传递的是原值. 在Java中,如果是基本数据类型,传递的是该参数字面量值的拷贝.如果是引用数据类型,传递的是该参数所引用对象在堆中地址的拷贝. swap(int a ...