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

 1 /**
 2  * UESTC
 3  * Problem#594
 4  * Accepted
 5  * Time:364ms
 6  * Memory:1364k
 7  */
 8 #include<iostream>
 9 #include<cstdio>
10 using namespace std;
11 typedef bool boolean;
12 #define inf 0x3fffffff
13 #define smin(a, b) (a) = min((a), (b))
14 #define smax(a, b) (a) = max((a), (b))
15
16 int n, c;
17 int *h;
18 int t;
19 int f[2][105];
20
21 inline boolean init() {
22     if(scanf("%d%d", &n, &c) == -1)    return false;
23     h = new int[(const int)(n + 1)];
24     for(int i = 1; i <= n; i++) {
25         scanf("%d", h + i);
26     }
27     return true;
28 }
29
30 int q[105];
31 int rear;
32 inline void solve() {
33     t = 0;
34     for(int i = 0; i < h[1]; i++)
35         f[t][i] = inf;
36     for(int i = h[1]; i <= 100; i++)
37         f[t][i] = (i - h[1]) * (i - h[1]);
38     for(int i = 2; i <= n; i++) {
39         t ^= 1;
40         rear = 0;
41         for(int j = 0; j <= 100; j++) {
42             int val = f[t ^ 1][j] - j * c;
43             while(rear && q[rear] > val)    rear--;
44             q[++rear] = val;
45             if(j < h[i])
46                 f[t][j] = inf;
47             else
48                 f[t][j] = q[1] + j * c + (j - h[i]) * (j - h[i]);
49         }
50         rear = 0;
51         for(int j = 100; j >= h[i]; j--) {
52             int val = f[t ^ 1][j] + j * c;
53             while(rear && q[rear] > val)    rear--;
54             q[++rear] = val;
55             smin(f[t][j], q[1] - j * c + (j - h[i]) * (j - h[i]));
56         }
57     }
58     int res = inf;
59     for(int i = 0; i <= 100; i++)
60         smin(res, f[t][i]);
61     printf("%d\n", res);
62     delete[] h;
63 }
64
65 int main() {
66     while(init()) {
67         solve();
68     }
69     return 0;
70 }

类似单调队列的代码

Code(常数优化后的代码)

 1 /**
 2  * UESTC
 3  * Problem#594
 4  * Accepted
 5  * Time:136ms
 6  * Memory:1172k
 7  */
 8 #include<iostream>
 9 #include<cstdio>
10 using namespace std;
11 typedef bool boolean;
12 #define inf 0x3fffffff
13 #define smin(a, b) (a) = min((a), (b))
14 #define smax(a, b) (a) = max((a), (b))
15
16 int n, c;
17 int t;
18 int h[50005];
19 int f[2][105];
20
21 inline boolean init() {
22     if(scanf("%d%d", &n, &c) == -1)    return false;
23     for(int i = 1; i <= n; i++) {
24         scanf("%d", h + i);
25     }
26     return true;
27 }
28
29 int cmp;
30 inline void solve() {
31     t = 0;
32     for(int i = 0; i < h[1]; i++)
33         f[t][i] = inf;
34     for(int i = h[1]; i <= 100; i++)
35         f[t][i] = (i - h[1]) * (i - h[1]);
36     for(int i = 2; i <= n; i++) {
37         t ^= 1;
38         cmp = inf;
39         for(int j = 0; j <= 100; j++) {
40             int val = f[t ^ 1][j] - j * c;
41             smin(cmp, val);
42             if(j < h[i])
43                 f[t][j] = inf;
44             else
45                 f[t][j] = cmp + j * c + (j - h[i]) * (j - h[i]);
46         }
47         cmp = inf;
48         for(int j = 100; j >= h[i]; j--) {
49             int val = f[t ^ 1][j] + j * c;
50             smin(cmp, val);
51             smin(f[t][j], cmp - j * c + (j - h[i]) * (j - h[i]));
52         }
53     }
54     int res = inf;
55     for(int i = 0; i <= 100; i++)
56         smin(res, f[t][i]);
57     printf("%d\n", res);
58 }
59
60 int main() {
61     while(init()) {
62         solve();
63     }
64     return 0;
65 }
时间: 2024-10-10 18:03:31

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

[UESTC 594] 我要长高

题目链接: 我要长高 题目分析: 设\(dp[i][j]\)表示到第\(i\)个人,他的身高是\(j\)的时候的最小损失,然后得到一个朴素的转移方程 \(dp[i][j] = min(dp[i - 1][k] + abs(k - j) * C + (j - a[i]) ^ 2)\) 把无关的丢到\(min\)外面来 \[ dp[i][j] = \left\{ \begin{aligned} min(dp[i - 1][k] + k * C) - j * C + (j - a[i]) ^ 2 (j

UESTC 594 我要长高 dp单调队列优化入门

//其实是个伪单调队列...渣渣刚入门 //戳这里:594 //dp[ i ][ j(现身高) ] = min(    dp[ i ][ k(现身高) ]  + fabs( j(现身高) - k(现身高) ) * C + ( j(现身高) - h[i](原身高) )  *( j(现身高) - h[i](原身高) )     ); 观察到可以单调队列优化,O(N * H * H)  —>  O(N * H) j >= k 时, dp[ i ][ j ] = min (    dp[ i ][ k

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

http://acm.uestc.edu.cn/#/problem/show/594 [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=5e4+2; 5 const int inf=0x3f3f3f3f; 6 int n,c; 7 int cur; 8 int dp[2][maxn]; 9 int q[maxn]; 10 int main() 11 { 1

nginx高并发优化

nginx 高并发优化 一.关闭系统中不需要的服务 二.优化磁盘写操作 mount -o remount defaults,noatime,nodiratime partion mount_partion fstab 将partion mount_partion defaults 0 0 修改为partion mount_partion defaults,noatime,nodiratime 0 0 即修改为写入磁盘不修改访问时间 三.优化资源限制 ulimit -n 和ulimit -u 即o

网站跳出率高的优化方案

本文给大家分享一个网站跳出率高的优化的实例,每个用户都会向我们提供重要的SEO数据,我们可以通过百度站长平台和网站后台,分析筛选出这些用户数据,就可以知道是什么原因导致了网站跳出率高的问题!当一个用户点击网站页面,没有点击任何连接,那网站的跳出率就是百分之百.通过页面优化,降低了页面跳出率,也就提升了页面质量.我们通过某个精油网站的案例来分析 我们找到一个<护发精油的使用方法>的页面,看看这个页面是如何降低跳出率的.主要有两点: 1 .内容质量要很好. 内容要从用户角度出发,解决用户的问题.如

dp 单调性优化总结

对于单调性优化其实更多的是观察dp的状态转移式子的单调性 进而用优先队列 单调队列 二分查找什么的找到最优决策 使时间更优. 对于这道题就是单调性优化的很好的例子 首先打一个暴力再说. f[i][j]表示前i个木匠刷前j个木板所得到的最大价值 f[i][j]=max(f[i][j],f[i-1][j]); f[i][j]=max(f[i][j],f[i][j-1]) f[i][j]=max(f[i][j],f[i-1][k]+(j-k)*r(j));(k<t(j)<=j)&&(

51nod 1001 数组中和等于k的数对(单调性优化)

给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对.例如K = 8,数组A:{-1,6,5,3,4,2,9,0,8},所有和等于8的数对包括(-1,9),(0,8),(2,6),(3,5). Input 第1行:用空格隔开的2个数,K N,N为A数组的长度.(2 <= N <= 50000,-10^9 <= K <= 10^9) 第2 - N + 1行:A数组的N个元素.(-10^9 <= A[i] <= 10^9)  Outp

【美容护肤】美白,瘦身,长高,去痘,去斑,太全啦!

[美白] 用手捧一把的大米 淘一遍的水倒掉 要第二遍的水 淘米水呈弱碱性 皮肤也是 所以对皮肤真的是非常好 然后把大米倒进一个小锅里面 倒大约2小碗水 煮大约30分钟左右 直到大米变的很粘稠为止 先用淘米水把面部清洁干净 之后把粘稠的煮熟的大米抹在脸上 你会发现皮肤摸起来滑滑的 很滋润 大约15分钟左右洗掉脸上的大米 照一下镜子 镜子里面的自己是不是白了很多呢? [去黑头] 黑头真的是很让人烦恼的呢 主要是毛孔堵塞垃圾出不来的原因 大热天儿的 汗从堵塞的毛孔排不出来真的很让人恼火的呢 用苏打粉吧

如何高质量优化自己网站提高排名?

有很多SEO新手,对网站优化知识有些了解,但不知道具体怎么操作,所以今天我来谈谈如何更加科学合理的优化自己的网站,让新手们少走弯路,这也只是我在做网站优化时的一些个人总结,希望能对SEO新手们有所帮助. 网站优化一般分为站内优化和站外优化.站内优化通俗的讲就是网站内部结构优化,主要操作包括网站代码优化.Meta标签优化.Url优化.站内内容优化等:站外优化指的是网站外部优化,包括发外链与品牌的推广.下面来细说一下: 站内优化 一.代码优化:网站开发语言建议采用PHP,网页框架采用DIV+CSS样