韩父有N个儿子,分别是韩一,韩二…韩N。由于韩家演技功底深厚,加上他们间的密切配合,演出获得了巨大成功,票房甚至高达2000万。舟子是名很有威望的公知,可是他表面上两袖清风实则内心阴暗,看到韩家红红火火,嫉妒心遂起,便发微薄调侃韩二们站成一列时身高参差不齐。由于舟子的影响力,随口一句便会造成韩家的巨大损失,具体亏损是这样计算的,韩一,韩二…韩N站成一排,损失即为C×(韩i与韩i+1的高度差(1≤i<N))之和,搞不好连女儿都赔了.韩父苦苦思索,决定给韩子们内增高(注意韩子们变矮是不科学的只能增高或什么也不做),增高1cm是很容易的,可是增高10cm花费就很大了,对任意韩ii,增高Hcm的花费是H2.请你帮助韩父让韩家损失最小。

Input

有若干组数据,一直处理到文件结束。

每组数据第一行为两个整数:韩子数量N(1≤N≤50000)和舟子系数C(1≤C≤100)

接下来NN行分别是韩i的高度(1≤hi≤100)。

Output

对每组测试数据用一行输出韩家的最小损失。

Sample Input

5 2
2
3
5
1
4

Sample Output

15

Hint

输入数据多请使用scanf代替cin


  f[i][j]表示第i个人,高度为j的最小损失,显然

  然后乱搞一下,分类发讨论一下绝对值,把无关项都移出来,于是得到了

  接着跑两道单调队列优化就好了,总时间复杂度O(100n),动态规划的空间复杂度如果开滚动数组就是O(200)

  由于此题比较特殊,所以可以直接更新一个变量,单调队列都不用了。

Code

 /**
* UESTC
* Problem#594
* Accepted
* Time:364ms
* Memory:1364k
*/
#include<iostream>
#include<cstdio>
using namespace std;
typedef bool boolean;
#define inf 0x3fffffff
#define smin(a, b) (a) = min((a), (b))
#define smax(a, b) (a) = max((a), (b)) int n, c;
int *h;
int t;
int f[][]; inline boolean init() {
if(scanf("%d%d", &n, &c) == -) return false;
h = new int[(const int)(n + )];
for(int i = ; i <= n; i++) {
scanf("%d", h + i);
}
return true;
} int q[];
int rear;
inline void solve() {
t = ;
for(int i = ; i < h[]; i++)
f[t][i] = inf;
for(int i = h[]; i <= ; i++)
f[t][i] = (i - h[]) * (i - h[]);
for(int i = ; i <= n; i++) {
t ^= ;
rear = ;
for(int j = ; j <= ; j++) {
int val = f[t ^ ][j] - j * c;
while(rear && q[rear] > val) rear--;
q[++rear] = val;
if(j < h[i])
f[t][j] = inf;
else
f[t][j] = q[] + j * c + (j - h[i]) * (j - h[i]);
}
rear = ;
for(int j = ; j >= h[i]; j--) {
int val = f[t ^ ][j] + j * c;
while(rear && q[rear] > val) rear--;
q[++rear] = val;
smin(f[t][j], q[] - j * c + (j - h[i]) * (j - h[i]));
}
}
int res = inf;
for(int i = ; i <= ; i++)
smin(res, f[t][i]);
printf("%d\n", res);
delete[] h;
} int main() {
while(init()) {
solve();
}
return ;
}

类似单调队列的代码

Code(常数优化后的代码)

 /**
* UESTC
* Problem#594
* Accepted
* Time:136ms
* Memory:1172k
*/
#include<iostream>
#include<cstdio>
using namespace std;
typedef bool boolean;
#define inf 0x3fffffff
#define smin(a, b) (a) = min((a), (b))
#define smax(a, b) (a) = max((a), (b)) int n, c;
int t;
int h[];
int f[][]; inline boolean init() {
if(scanf("%d%d", &n, &c) == -) return false;
for(int i = ; i <= n; i++) {
scanf("%d", h + i);
}
return true;
} int cmp;
inline void solve() {
t = ;
for(int i = ; i < h[]; i++)
f[t][i] = inf;
for(int i = h[]; i <= ; i++)
f[t][i] = (i - h[]) * (i - h[]);
for(int i = ; i <= n; i++) {
t ^= ;
cmp = inf;
for(int j = ; j <= ; j++) {
int val = f[t ^ ][j] - j * c;
smin(cmp, val);
if(j < h[i])
f[t][j] = inf;
else
f[t][j] = cmp + j * c + (j - h[i]) * (j - h[i]);
}
cmp = inf;
for(int j = ; j >= h[i]; j--) {
int val = f[t ^ ][j] + j * c;
smin(cmp, val);
smin(f[t][j], cmp - j * c + (j - h[i]) * (j - h[i]));
}
}
int res = inf;
for(int i = ; i <= ; i++)
smin(res, f[t][i]);
printf("%d\n", res);
} int main() {
while(init()) {
solve();
}
return ;
}

UESTC 594 我要长高 - 单调性优化的更多相关文章

  1. 【单调队列优化dp】uestc 594 我要长高

    http://acm.uestc.edu.cn/#/problem/show/594 [AC] #include<bits/stdc++.h> using namespace std; t ...

  2. UESTC - 594 我要长高

    他们oj挂掉啦, 我先保存一下代码... 直接dp复杂度, n * 100 * 100, 我们可以将前一个人的信息丢进单调队列中去,可以优化成n * 100; #include<bits/std ...

  3. 性能调优之MYSQL高并发优化

    性能调优之MYSQL高并发优化   一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...

  4. CF868F Yet Another Minimization Problem 分治决策单调性优化DP

    题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...

  5. Mysql占用CPU过高如何优化,如何解决

    2017-02-28 15:13 331人阅读 评论(0) 收藏 举报   MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...

  6. dp 单调性优化总结

    对于单调性优化其实更多的是观察dp的状态转移式子的单调性 进而用优先队列 单调队列 二分查找什么的找到最优决策 使时间更优. 对于这道题就是单调性优化的很好的例子 首先打一个暴力再说. f[i][j] ...

  7. Apache Tomcat 8.5 安全配置与高并发优化

    通常我们在生产环境中,Tomcat的默认配置显然不能满足我们的产品需求,所以很多时候都需要对Tomcat的配置进行调优,以下综合我自己的经验来配置 Tomcat 安全与优化情况,如果你有更好的方案,请 ...

  8. 一看就懂的MySQL的聚簇索引,以及聚簇索引是如何长高的

    这一篇笔记我们简述一下 MySQL的B+Tree索引到底是咋回事? 聚簇索引索引到底是如何长高的. 一点一点看,其实蛮好理解的. 如果你看过了我之前的笔记,你肯定知道了MySQL进行CRUD是在内存中 ...

  9. 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)

    题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...

随机推荐

  1. The third column indicates whether subclasses of the class declared outside this package have access to the member.;

    总结1.modifier 改性剂 修饰符 修饰语 调节器access modifier 访问修饰符 存取权限 存取修饰词 存取修饰字官网“can”Access level modifiers dete ...

  2. Bitwise and Bit Shift Operators 位运算 取反 补码

    Bitwise and Bit Shift Operators (The Java™ Tutorials > Learning the Java Language > Language B ...

  3. SEO工作中如何增加用户体验?10个细节要注意!

    我们一直在做的网站SEO工作,如果你认为它的目的仅仅是为了提高网站的排名那就错了,还有一个同样很重要的方面就是增加用户的体验,使网站更加符合网民的浏览习惯,需要做到这个方面的成功我们有10个小细节是需 ...

  4. Java学习之路-Spring的HttpInvoker学习

    Hessian和Burlap都是基于HTTP的,他们都解决了RMI所头疼的防火墙渗透问题.但当传递过来的RPC消息中包含序列化对象时,RMI就完胜Hessian和Burlap了. 因为Hessian和 ...

  5. Oracle与Sql server 在SQL上的不同

    Oracle与Sql server都遵循SQL-92标准:http://owen.sj.ca.us/rkowen/howto/sql92F.html,但是也有一些不同之处,差别如下: Oracle中表 ...

  6. OC 手势可能出现的问题

    oc手势有分別是 Tap(点一下).Pinch(二指往內或往外拨动).Rotation(旋转).Swipe(滑动,快速移动).Pan (拖移,慢速移动)以及 LongPress(长按). UITapG ...

  7. 文件上传 - iframe上传

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Spark-2.0原理分析-shuffle过程

    shuffle概览 shuffle过程概览 shuffle数据流概览 shuffle数据流 shuffle工作流程 在运行job时,spark是一个stage一个stage执行的.先把任务分成stag ...

  9. 版本 ------- 2017年最受开发者欢迎的10个Linux发行版

    1.Arch Linux Arch Linux在安装过程中提供了强大的可定制选择,支持你下载和安装自己所需的程序包.虽然这个选择对新手来说没有多大的帮助,但是它确实能够帮助那些使用Arch构建系统和存 ...

  10. 什么是anaconda【转载】

    转自:https://zhidao.baidu.com/question/525102108723657245.html https://zhidao.baidu.com/question/62475 ...