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 ...
随机推荐
- sql查询两条记录的时间差
今天突然想到了一个需求,即在一张带有id和time字段的表中,查询相邻时间的时间差. 表的记录如下: 表名为wangxin id是一个不重复的字符串,time是一个时间戳. 现在的需求如下: 比如id ...
- dp——01背包
今天学习了01背包不算是复习吧,发现完全不会状态之间的转移如此让我捉摸不透尽管很简单但本人觉得还是很难,奇怪地拐点也很难被发现.知道01背包二维的话是很慢的,然后就是非得先打二维毕竟一维是根据二维的想 ...
- UITableView左右滑动cell无法显示“删除”按钮的原因分析
http://www.cocoachina.com/bbs/read.php?tid-145693.html - (void)tableView:(UITableView *)tableView co ...
- SpringMVC:JSON形式输出(基于Fastjson)
在Spring3.0中,@ResponseBody标记可以将对象"封装"为JSON形式的数据,并输出,下面的例子中使用的是阿里的Fastjson JSONaz解析工具,在sprin ...
- LightOj 1265 - Island of Survival(概率)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1265 题目大意:有一个生存游戏,里面t只老虎,d只鹿,还有一个人,每天都要有两个生物碰 ...
- Alisha’s Party---hdu5437(模拟+优先队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5437 题意:公主有k个朋友来参加她的生日party,每个人都会带价值为v[i]的礼物过来,在所有人到齐 ...
- 洛谷P4424 寻宝游戏 [HNOI/AHOI2018]
正解:思维题 解题报告: 传送门! 这题就是很思维题,,,想到辣实现麻油特别难,但难想到是真的TT 这题主要是要发现一个性质:&1无意义,&0相当于赋值为0,|1无意义,|1相当于赋值 ...
- 怎样知道 CPU 是否支持虚拟化技术(VT) | Linux 中国
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/79832475 wx_fmt=png&a ...
- PHP DB 数据库连接类
近期观看了一节 PHP 消息队列视频,对于讲师WiconWang提供的代码,在此分享一下,希望能对爱学习的小伙伴有所帮助… <?php // 数据库连接类 class DB{ //私有的属性 p ...
- POJ3096:Surprising Strings(map)
http://poj.org/problem?id=3096 for循环真是奇妙! #include <string.h> #include <stdio.h> #includ ...