考虑大概按照这个每次向序列末尾添加一个颜色的过程 dp,把我们关注的两样东西记入状态:记 f(i,S)=0/1 表示顺次考虑到末尾下标为 i 的序列,使用颜色的集合为 S 是否可行(注意到序列长度即 2|S|,不用记录什么“最大长度”)。转移枚举一个没用过的颜色 x 加到末尾,贪心地选取 i 之后最近的两个下标 j,k 且 j<k,a_j=a_k=x,转移到 f(k,S\cup\{x\})。状态数 O(n2^m)。
考虑优化状态。实际上你往一个前面已经决定好的序列末尾加入一个颜色,只关心的是颜色的集合,这些用过的颜色怎么排列是不重要的。而且 bool 的状态太浪费了,完全可以把 i 扔进状态对应的值里面去,即对同样颜色集合构成的序列只取末尾最靠前的转移。此时状态变为 f_S,表示使用颜色集合为 S 的合法序列,序列末尾下标的最小值。转移类似枚举 x,取最前的两个下标 j,k 满足 f_S<j<k,a_j=a_k=x,更新 f_{S\cup \{x\}} \to \min(f_{S\cup \{x\}},k)。