UESTC 594 我要长高 - 单调性优化
韩父有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 我要长高 - 单调性优化的更多相关文章
- 【单调队列优化dp】uestc 594 我要长高
http://acm.uestc.edu.cn/#/problem/show/594 [AC] #include<bits/stdc++.h> using namespace std; t ...
- UESTC - 594 我要长高
他们oj挂掉啦, 我先保存一下代码... 直接dp复杂度, n * 100 * 100, 我们可以将前一个人的信息丢进单调队列中去,可以优化成n * 100; #include<bits/std ...
- 性能调优之MYSQL高并发优化
性能调优之MYSQL高并发优化 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之 ...
- CF868F Yet Another Minimization Problem 分治决策单调性优化DP
题意: 给定一个序列,你要将其分为k段,总的代价为每段的权值之和,求最小代价. 定义一段序列的权值为$\sum_{i = 1}^{n}{\binom{cnt_{i}}{2}}$,其中$cnt_{i}$ ...
- Mysql占用CPU过高如何优化,如何解决
2017-02-28 15:13 331人阅读 评论(0) 收藏 举报 MySQL占用CPU过高如何优化 一次生产DB服务器的 超负荷运行问题解决: 1.查看生产DB服务器top列表, 执行 to ...
- dp 单调性优化总结
对于单调性优化其实更多的是观察dp的状态转移式子的单调性 进而用优先队列 单调队列 二分查找什么的找到最优决策 使时间更优. 对于这道题就是单调性优化的很好的例子 首先打一个暴力再说. f[i][j] ...
- Apache Tomcat 8.5 安全配置与高并发优化
通常我们在生产环境中,Tomcat的默认配置显然不能满足我们的产品需求,所以很多时候都需要对Tomcat的配置进行调优,以下综合我自己的经验来配置 Tomcat 安全与优化情况,如果你有更好的方案,请 ...
- 一看就懂的MySQL的聚簇索引,以及聚簇索引是如何长高的
这一篇笔记我们简述一下 MySQL的B+Tree索引到底是咋回事? 聚簇索引索引到底是如何长高的. 一点一点看,其实蛮好理解的. 如果你看过了我之前的笔记,你肯定知道了MySQL进行CRUD是在内存中 ...
- 洛谷 P5897 - [IOI2013]wombats(决策单调性优化 dp+线段树分块)
题面传送门 首先注意到这次行数与列数不同阶,列数只有 \(200\),而行数高达 \(5000\),因此可以考虑以行为下标建线段树,线段树上每个区间 \([l,r]\) 开一个 \(200\times ...
随机推荐
- CodeForces - 583D Once Again... LIS 循环
题意:给你n个数(n<=100,ai<=300) 一个T,求n重复T次的最长非递减子序列. 题解:我直接考虑4 3 2 1 的例子,当其重复4次时会出现1 2 3 4 的子序列 ,此时再 ...
- Oracle备份恢复之热备份恢复及异机恢复
原理: 数据库必须运行在归档模式下,否则备份没有意义.备份前冻结块头,使scn号不变化,然后cp物理文件,最后解冻块头.此过程dml语句可以正常执行,动作被写在日志文件里面,当解冻scn号后,日志文件 ...
- postgresql+postgis+pgrouting安装步骤图解
1.在此(https://www.bigsql.org/postgresql/installers.jsp/)下载postgresql(开源数据库,gis行业推荐使用); 2.在此(http://wi ...
- snowflake and uuid
分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的. 有些时候我们希望能使用一种简单一 ...
- linux中fork函数详解(转)
add by zhj: 在Linux,创建进程是用fork(),它其实就是拷贝父进程的数据段和其它数据,这相当于C函数调用中的值传递,这是 此后两者的修改都互不影响.因为两者的数据虽相同,但却在不同的 ...
- AMD 和 CMD 的区别有哪些
在说AMD 和 CMD 的区别之前,先说明commonjs,它的回调和amd.cmd的不同于:commomjs加载完了所有模块,才执行回调amd和cmd是加载对应的模块,就可以执行回调中对应的代码 1 ...
- 对nodejs的理解(一)
1.介绍一下事件驱动编程---快餐店点餐. 在基于线程的方式中(thread-based way)你到了柜台前,把你的点餐单给收银员或者给收银员直接点餐,然后等在那直到你要的食物准备好给你.收银员不能 ...
- 给sql server2005打补丁报错:无法安装Windows Installer MSP文件
给sql server2005打补丁报错:无法安装Windows Installer MSP文件 在我们安装完SQL2005数据库后,需要安装SP4补丁时,会出错:无法安装Windows Instal ...
- 【剑指Offer学习】【面试题3 :二维数组中的查找】
package 二维数组查找; public class Test03 { /** * 在一个二维数组中,每一行都按 package 二维数组查找; public class Test03 { /** ...
- toFixed()与toPrecision()
toFixed(n): 返回一个字符串,代表一个以定点表示法表示的数字. n在0~20之间 var g=1.023; var f=g.toFixed(2); f的值为:1.02, typeof ...