韩父有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. 各种小巧的Hello World

    在Reddit看到这篇文章:Hello from a libc-free world! ,觉得挺有趣,然后又想起以前看过的各种相关资料,在此做一个整理.注意所有实验环境都为Linux. 版本一: 实际 ...

  2. 【linux & &&命令】&后台(并行)命令 &&串行命令

    & 放在一个命令末尾,可以将这个命令放到后台执行.放到后台后主进程将继续向下执行,后台命令将与主进程并行执行. &&  放在一个命令末尾,与什么都没有单纯换行实际效果相同,等待 ...

  3. Redis具体解释与常见问题解决方式

    Redis简单介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对很多其它.包含string(字符串).list(链表).set(集合).zset ...

  4. mysql 操作sql语句 操作数据库

    sql语句 #1. 操作文件夹 创建数据库:create database db1 charset utf8; 查数据库:show databases; mysql> create databa ...

  5. Linux Packages Search

    网站 : https://www.pkgs.org/ https://centos.pkgs.org/

  6. 万恶之源 - Python基础数据类型一

    整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是:  -2**31-2**31-1,即-2147483648-2147483647 在64 ...

  7. [adt]python实现栈-体验数据结构

    经常使用py的一些数据结构,如list,及list的一些方法. 还有hash表等. 各类数据结构方法用的很6,然而不知道是底层是怎么实现的. 基于此,就开始研究一下py实现一些数据结构, 以便于对计算 ...

  8. Mysql查询一个表的所有字段名

    select COLUMN_NAME from information_schema.`COLUMNS`        -- 这行不变,照抄 where TABLE_SCHEMA = 'xerp'   ...

  9. VMWARE安装centos6 http://www.centoscn.com/image-text/setup/2013/0816/1263.html

    http://www.centoscn.com/image-text/setup/2013/0816/1263.html

  10. 004-ubuntu安装配置SSH服务

    一.ssh安装. 1.# sudo apt-get -y install openssh-server. 2.在/etc/ssh/sshd_config文件中添加一句:PermitRootLogin ...