Living-Dream 系列笔记 第32期

Posted on 2024-03-03 18:33  _XOFqwq  阅读(3)  评论(0编辑  收藏  举报

本期讲解内容与上一期一致。

T1

考虑枚举“山顶”(即在行走路线中到达的海拔最高的地方)的位置来求解。

对于枚举到的一个“山顶” \(i\),显然此时最多浏览的景点数为“以 \(i\) 结尾的最长上升子序列的长度”加上“以 \(i\) 开头的最长下降子序列的长度”再减一。

对于求“以 \(i\) 开头的最长下降子序列的长度”,我们转化为求“以 \(i\) 结尾的最长上升子序列的长度”即可,只不过需要倒叙枚举。

T2

妙妙题。

很容易想到,两次买卖都可以选择任意两天 \((i,j)\)

第一次买卖选择前 \(i\) 天价格最低的那天买入,再在第 \(i\) 天卖出;

第二次买卖选择第 \(j\) 天买入,再在第 \(j\) 天后价格最高的那天卖出。

这样既保证了效益最大化,又避免了两段持有股票的区间相互重叠。

因此我们可以维护一个 \(dp_i\) 表示“最小前缀”(即前 \(i\) 天的最小值),\(f_i\) 表示“最大后缀”(即第 \(i\) 天后的最大值),

然后枚举任意两天 \((i,j)\),此时的答案为 \(a_i-dp_i+f_j-a_j\),对所有这样的答案取 \(\max\) 即为最终答案。

时间复杂度 \(O(Tn^2)\),显然是过不了的。

于是我们想到维护 \(dp_i\) 表示“前 \(i\) 天的最大利润”,\(f_i\) 表示“第 \(i\) 天后的最大利润”。

这样改动之后,答案即为 \(\max\{dp_i+f_i\}\),可以用 \(O(n)\) 的时间复杂度算出。

完结撒花~