AT_abc237_f [ABC237F] |LIS| = 3 题解

AT_abc237_f [ABC237F] |LIS| = 3 题解

洛谷。

题意够简练了,不复述。

避坑

注意,洛谷的翻译有误,数列各项可以等于 M M M,不是 M M M​ 以下!!

而且 “最长增加部分列” 最好改为 “最长上升子序列”。

思路

胖头鱼教练:看题吧。

我:怎么动态维护最长上升子序列长度啊……

这时,注意到我们维护最长上升子序列长度并不关心序列所有数是多少

那么我们可以把最长上升子序列长度分别是 1 1 1 2 2 2 3 3 3 序列中的最大数维护出来,因为我们如果要更新最长上升子序列只看最大数。

那么想想算法。

这题我是从 dp 专题里看到的,所以当然是 dp 喽。

f i , l 1 , l 2 , l 3 f_{i,l1,l2,l3} fi,l1,l2,l3 表示当前考虑到前 i i i 个数,长度为 1 1 1 的最大数是 l 1 l1 l1 2 2 2 的最大数是 l 2 l2 l2 3 3 3 的最大数是 l 3 l3 l3 的答案。

那么看看状态转移方程。

对于我们当前要插入的数字 v v v,考虑它可以插在哪里——
{   f i , v , l 2 , l 3 = f i , v , l 2 , l 3 + f i − 1 , l 1 , l 2 , l 3    ( v ≤ l 1 )

你可能感兴趣的:(题解,算法,数据结构,开发语言,c++,学习)