题目链接:codeforces 1631E
题目思路:
如果数字之间不影响,那么直接考虑贪心,每次选最长的区间,然后中间的改为 1 1 1。但是有可能中间的数字有可能是其他区间的端点。
考虑用动态规划来解决。首先某个数字最后出现的位置一定是区间的右端点,用一个数组 pos
记录某个数字最后出现的位置。定义 dp[i]
为前 i
个 0 0 0 的个数。为什么是 0 0 0 的个数而不是 1 1 1 的个数呢?因为填 0 0 0 的位置是端点,转移的时候用端点比较好写方程。
显然,第一个数一定是左端点,定义状态转移方程:
d p [ i ] = m i n ( d p [ i − 1 ] + 1 , d p [ i ] ) dp[i] = min(dp[