Codeforces Round 462 (Div. 1) A - A Twisty Movement

· · 题解

Codeforces Round 462 (Div. 1) A - A Twisty Movement

题目描述

给定一个由 12 组成的序列,你可以进行至多一次操作,翻转其中的一个区间内的数。求翻转后的序列的最长非降子序列。

n \le 2000, a_i \in \{1, 2\}

分析

考虑 DP

由于序列只有两个数,那么最终的非降子序列一定是 \{1, 1, \dots 1, 2, 2, \dots, 2\} 这样的形式。可以这样表示:[1][2],表示分别由 12 组成的序列。其中这两个部分可能为空。

如果翻转后得到 [1][2],那么翻转前的子序列应该是 [1][2][1][2] 的形式,使得交换中间两个子序列后变成非降子序列。同样的,这些序列也可以为空。

因为最多交换一次,所以题目变成了找原序列的最长子序列,且形式为 [1][2][1][2]

一共有 4 部分,分别将其标号为 0 \sim 3。设状态 f_{i, j}(j \in [0, 3]) 表示序列前 i 个数中,选择前 j 个序列的最长长度。接下来考虑转移。

最后答案为 f_{n, 3}

\text{Code}