题解 CF603A Alternative Thinking

考虑 dp .

我们令 \(f_{i,0}\) 表示当前第 \(i\) 个数字没有翻转,且前面无子串翻转的最大值。同理,\(f_{i,1}\) 表示当前第 \(i\) 个数字没有翻转,且前面有子串翻转的最大值。最后,\(f_{i,2}\) 表示前 \(i\) 个数字反转的最大值。答案即使三者取最大值。

一个小插曲,为什么想到这样设状态呢?

首先当然是因为题目就是这么问的。其次,我们分三个数组递推显然会很麻烦,不如用不同的 j 值来代表这三种情况。

既然如此,不难推出转移方程:

\(a_i = a_{i-1}\) 则:

\[\left\{\begin{array}{l}f_{i,0}=f_{i-1,0}\f_{i,1}=\max( f_{i-1,2}+1,f_{i-1,1})\f_{i,2}=\max( f_{i-1,2},f_{i-1,0}+1) \end{array}\right. \]

否则,则:

\[\left\{\begin{array}{l}f_{i,0}=f_{i-1,0}+1\f_{i,1}=\max( f_{i-1,1}+1,f_{i-1,2})\f_{i,2}=\max( f_{i-1,2}+1,f_{i-1,0}) \end{array}\right. \]

最后初值:

\[\left\{\begin{array}{l}f_{1,0}=1\f_{1,1}=1\f_{1,2}=1 \end{array}\right. \]

完结撒花。

题解 CF603A Alternative Thinking

上一篇:go文件操作


下一篇:IE9的css hack