此题考察算法: 动态规划,dp \colorbox{#E74C3C}{\color{white}动态规划,dp} 动态规划,dp。
思路
状态:
定义 | 前面是否有子串翻转 | 当前第 i i i 个数字是否反转 |
---|---|---|
d p i , 0 dp_{i,0} dpi,0 | 否 | 否 |
d p i , 1 dp_{i,1} dpi,1 | 是 | 否 |
d p i , 2 dp_{i,2} dpi,2 | 否 | 是 |
初始值
因为无论如何,第 1 1 1 个形成的子序列长度是 1 1 1。所以
{ d p 1 , 0 = 1 d p 1 , 1 = 1 d p 1 , 2 = 1 \begin{cases}dp_{1,0}=1\\dp_{1,1}=1\\dp_{1,2}=1\end{cases} ⎩⎪⎨⎪⎧dp1,0=1dp1,1=1dp1,2=1
转移方程
对于所有满足条件的 i ( 2 ≤ i ≤ n ) i(2\le i \le n) i(2≤i≤n),当
a i = a i − 1 a_i=a_{i-1} ai=ai−1 时:
- d p i , 0 dp_{i,0} dpi,0
因为第 i i i 个不反转,前面的也不翻转,得出递推式:
d p i , 0 = d p i − 1 , 0 dp_{i,0}=dp_{i-1,0} dpi,0=dpi−1,0
- d p i , 1 dp_{i,1} dpi,1
因为第 i i i 个不反转,前面的会翻转,要么第 i − 1 i-1 i−1 个翻转(他俩本相同,当前又不翻转,则不同,长度需加 1 1 1),要么第 i − 1 i-1 i−1 个之前早就翻转完了。得出递推式:
d p i , 1 = max { d p i − 1 , 2 + 1 d p i − 1 , 1 dp_{i,1}=\max\begin{cases}dp_{i-1,2}+1\\dp_{i-1,1}\end{cases} dpi,1=max{