首页 > 其他分享 >AT_dp_z Frog 3 题解

AT_dp_z Frog 3 题解

时间:2024-03-02 17:11:06浏览次数:25  
标签:slope 题解 kh Frog 转移 2h 节点 dp

这题的朴素 dp 是显然的。

令 \(dp_i\) 表示跳到第 \(i\) 个石头的最小花费,有转移方程:

\[dp_i=\min_{j=1}^{i-1}\{dp_j+(h_i-h_j)^2+C\} \]

直接转移是 \(O(n^2)\) 的,考虑优化。

首先对于 \(\min\) 以内的式子化简,得:

\[dp_j+h_i^2+h_j^2-2h_ih_j+C \]

将与 \(j\) 无关的项剔除,得:

\[dp_j+h_j^2-2h_ih_j \]

令 \(f_i\) 表示 \(dp_i+h_i^2\),\(k\) 表示 \(-2h_i\),得:

\[f_j+kh_j \]

此时,我们考虑有两个转移点 \(j_1,j_2\)。

若 \(j_1<j_2\) 且 \(j_2\) 一定不比 \(j_1\) 更优,仅当:

\[f_{j_1}+kh_{j_1} \le f_{j_2}+kh_{j_2} \]

移项,得:

\[kh_{j_1}-kh_{j_2} \le f_{j_2}-f_{j_1} \]

两边同时除以 \(h_{j_1}-h_{j_2}\)(不等式要变号,因为 \(h_{j_1}-h_{j_2}<0\))得:

\[k \ge \dfrac{f_{j_2}-f_{j_1}}{h_{j_1}-h_{j_2}} \]

代入 \(k=-2h_i\),得:

\[-2h_i \ge \dfrac{f_{j_2}-f_{j_1}}{h_{j_1}-h_{j_2}} \]

两边同时乘以 \(-1\),得:

\[2h_i \ge \dfrac{f_{j_1}-f_{j_2}}{h_{j_1}-h_{j_2}} \]

然后我们发现这个式子与斜率的计算公式十分相似,于是考虑斜率优化。

具体地,我们分析三个候补转移节点 \(p_1,p_2,p_3\),它们满足 \(p_1<p_2<p_3\)。

令 \(\operatorname{slope}(i,j)\) 表示 \(\dfrac{f_i-f_j}{h_i-h_j}\)。

若 \(p_2\) 是最优转移节点,则有:

\[2h_i \ge \operatorname{slope}(p_1,p_2) \]

表示 \(p_1\) 一定不比 \(p_2\) 更优,并且有:

\[2h_i \le \operatorname{slope}(p_2,p_3) \]

表示 \(p_3\) 一定不比 \(p_2\) 更优,也即,当:

\[\operatorname{slope}(p_1,p_2) \le \operatorname{slope}(p_2,p_3) \]

时,有 \(p_2\) 为 \(p_1,p_2,p_3\) 中的最优转移节点。

这样每次选取最优转移节点,它们便组成了一个凸包。

由于题目保证 \(h_i\) 单调递增,

于是我们采用单调队列维护此凸包,

每次转移时从队头寻找最优转移节点,

转移完成后再从队尾弹出不是最优转移节点的节点即可。

这样转移的单次均摊时间复杂度降至 \(O(1)\),总时间复杂度为 \(O(n)\)。

实现是简单的。

标签:slope,题解,kh,Frog,转移,2h,节点,dp
From: https://www.cnblogs.com/XOF-0-0/p/18048907

相关文章

  • 喵了个喵 题解
    传送门这玩意是T2???观察到\(k=2n-2\)或\(k=2n-1\),所以我们可以尝试让每个栈里面都保持两张牌。同时保留一个空栈,用来消栈底。记这个保留的空栈为\(sp\)。策略1:如果当前牌堆顶的牌能消,必然消;否则除了\(sp\),如果存在一个没有填到两张牌的栈,放进去。当\(k=2n-1\)......
  • CF1915D Unnatural Language Processing 题解
    容易发现音节的划分不仅要求子串形如\(\texttt{CV}\)或\(\texttt{CVC}\),并且接下来的两个字符也必须是\(\texttt{CV}\),不然会导致无法划分下去。于是我们遍历字符串,找出所有满足上述条件的子串,记录需要输出\(\texttt{.}\)的位置即可。实现:intn;strings,ans,t="";cin>......
  • CF1915E Romantic Glasses 题解
    我们考虑维护\(sum_i\)表示前\(i\)个数中偶数下标的数之和与奇数下标的数之和之差,其中\(sum_0=0\)。若在某一时刻,有\(sum_i=sum_j(j<i)\),说明\(j\simi\)中偶数下标的数之和与奇数下标的数之和之差为\(0\)。这个使用map判断即可。实现:intn,f=0;cin>>n;m.clear()......
  • CF1921D Very Different Array 题解
    补充一个对本题贪心思路更(?)清楚的解释。本题贪心思路:在\(a_i,b_i\)分别升序的情况下,对于每个\(a_i\),与它差值最大的\(b_i\)只可能出现在\(b_{n-i+1}\)与\(b_{m-i+1}\)这两者中。证明:首先,假设我们有一个长度为\(n\)的升序序列\(s\)。则对于\(s_1\),与它差值最大......
  • CF10E 题解
    传送门有\(n\)种货币。找一个最小的金额\(x\),使得贪心法付款不是最优解;如果贪心法始终都是最优解,输出\(-1\)。\((n\le400)\)将货币集合记作一个\(n\)维向量\(C=(c_1,c_2,\dots,c_n)\)。对于金额\(x\)的一个表示法,也记作一个\(n\)维向量\(V\)。即\(C\timesV=x\)。......
  • NOIP2023 T4 题解
    T4写出转移方程:\(f_i\)表示前\(i\)天且第\(i\)天必须跑的最大能量值。\(g_i=\max\limits_{j=1}^i\{f_j\}\)。初值\(f_0=g_0=0\)。对于转移方程,考虑枚举最后一段跑的段是从哪里开始的:\(f_i=\displaystyle\max_{j=i-k+1}^i(g_{j-2}+prize(j,i)-(j-i+1)\timesd)\)。其中\(p......
  • SP14846 GCJ1C09C - Bribe the Prisoners 题解
    非常好区间dp。我们发现直接依题做是困难的,因此考虑反着做。也即,假定起初那\(Q\)个牢房均为空,现在要将给定的\(Q\)的犯人插入其中,求最小代价。然后我们发现这题和P1775很像,相当于每插入一个人,两段不相邻的牢房就被合并到了一起。接着我们就考虑这玩意怎么做区间dp。......
  • 【题解】「HDU 7084」Pty loves string
    CQBZOJHDU7084不难想到把最终在\(S\)从中间分开,就变成了前后两个broder拼起来。考场重现:直接把所有的broder求出来,将相同长度的broder的下标存在一起,然后暴力匹配,最后还没来及优化。考场代码(除了fail树,其她其实都挺逼近正解正解是建出fail树(甚至搞忘还有这东......
  • 2023互联网笔试记录汇总(61道真题+题解)
    以下编程题均为博主在2023年投递实习和秋招过程中的笔试真题(共61道编程题),为避免不必要的麻烦,不对题目的来源进行说明。3.4第一题题意:给一个数组(n≤2e5),求数组内任意数对的最大差值。即对任意i<j,求最大的x[j]-x[i]。题解:处理一下前缀最小值。第二题题意:给一个数组(n≤2e5......
  • 信息传递(题解)[并查集]
    题目题目描述有n个同学(编号为1到n)正在玩一个信息传递的游戏。在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学。游戏开始时,每人都只知道自己的生日。之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有......