[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 < k) \min(dp[i - 1][k] - k * C) + j * C + (j - a[i]) ^ 2 (j > k)\\end{aligned}
\right.
\]

直接枚举\(i,j,k\)显然是\(O(n^3)\)的,看到有\(min / max\)考虑怎么单调队列一下
然后发现好像不用单调队列也可以,我们只需要存储当前\(min\)里面那一坨的最小值就可以了

#include<bits/stdc++.h>
#define INF (1000000000 + 7)
#define N (50000 + 10)
using namespace std;
inline int read() {
    int cnt = 0, f = 1; char c = getchar();
    while (!isdigit(c)) {if (c == '-') f = -f; c = getchar();}
    while (isdigit(c)) {cnt = (cnt << 3) + (cnt << 1) + c - '0'; c = getchar();}
    return cnt * f;
}
int n, C, a[N], dp[N][105];
int gmin, lim, ans;
inline int Pow(int x) {return x * x;}
int main() {
//  freopen("1.in", "r", stdin);
    while (scanf("%d", &n) != EOF) {
        C = read();
        memset(dp, 0x3f3f, sizeof(dp));
        for (register int i = 1; i <= n; ++i) a[i] = read(), lim = max(lim, a[i]);
        for (register int i = a[1]; i <= lim; ++i) dp[1][i] = Pow(i - a[1]);
        for (register int i = 2; i <= n; ++i) {
            gmin = INF;
            for (register int j = a[i - 1]; j <= lim; ++j) {
                gmin = min(gmin, dp[i - 1][j] - C * j);
                if (j >= a[i]) dp[i][j] = gmin + Pow(j - a[i]) + C * j;
            }
            gmin = INF;
            for (register int j = lim; j >= a[i]; --j) {
                gmin = min(gmin, dp[i - 1][j] + C * j);
                if (j >= a[i]) dp[i][j] = min(dp[i][j], gmin + Pow(j - a[i]) - C * j);
            }
        }
        ans = INF;
        for (register int i = a[n]; i <= lim; ++i) ans = min(ans, dp[n][i]);
        printf("%d\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/kma093/p/11508732.html

时间: 2024-07-31 10:53:45

[UESTC 594] 我要长高的相关文章

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

UESTC 594 我要长高 - 单调性优化

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

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

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

怎样才能长高 让孩子快速长高的好方法

现在的家长朋友们除了关心孩子的身体健康以外,最关心的就是孩子的身高问题,但是有什么好的方法可以让孩子的身体长高呢?这是每位家长都关心的问题.有关专家提醒家长朋友们,想要让孩子随意的玩耍是可以的,但是一定要给孩子制定一套系统的运动方式,这样才更有利于孩子的成长,因为在平时的活动或者是运动的时候,使用的肌肉群是不一样的,而且每天的运动时间最好是保证在半个小时以上,因为生长激素在开始运动30分钟后分泌最旺盛. 运动是快乐的游戏而不是义务性的活动 大部分孩子都会散漫.集中力差,所以只要觉得不好玩了就会马

UESTC_我要长高 CDOJ 594

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

如何长高

在骨骼生長板關起來之前,如何掌握長高密碼?天天吃鈣片有用嗎?轉骨方要怎麼喝? 很多父母期望自己的孩子高人一等,在人群中能鶴立雞群,而不是被淹沒.明白攸關生長的重要知識,才能有效幫助孩子長高,並避免不切實際的過度期待. 人類有二個快速生長的黃金期:嬰兒期及青春期(女生平均每年長高8-10公分,男生10-12公分).在骨骼的生長板還未關閉前,是最後的長高機會,需要好好掌握. 林口長庚醫院兒童內分泌科主治醫師羅福松引述美國史丹佛大學Greulich及Pyle教授在<手與手腕骨骼發展之影像解剖學(Rad

编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议79~82)

建议79:集合中的哈希码不要重复 在一个列表中查找某值是非常耗费资源的,随机存取的列表是遍历查找,顺序存储的列表是链表查找,或者是Collections的二分法查找,但这都不够快,毕竟都是遍历嘛,最快的还要数以Hash开头的集合(如HashMap.HashSet等类)查找,我们以HashMap为例,看看是如何查找key值的,代码如下: 1 public class Client79 { 2 public static void main(String[] args) { 3 int size =

美国为什么放弃中国高铁?

前不久,美国铁路公司西部快线,单方面终止了与中铁国际合作的高铁项目,理由是,美国州政府要求在美国境内使用的高铁,必须是在美国境内生产的,而且抱怨中铁国际在推进项目进展的过程中,表现出的驾驭能力相对不足. 针对该言论,中铁国际深表遗憾,并已进行了严正交涉,措辞之强烈前所未有,斥责美方的行为是:错误和不负责任的.隔着屏幕,只消看一眼这两个词语,就感觉到中铁国际无比愤怒,好像一挂点燃的鞭炮,要把周边世界炸得烟火一片.其实,中铁国际在处理这件事情时,远没有情绪失控,只是我等小人物肆意渲染罢了,我们无非是