例如:
给定一个01串,现有翻转规则:翻转某一个位置时其后面2个位置也会跟着翻转,也就是每次翻转都会翻转3个连续的位置。要将01串全部翻转为0,求最小的翻转次数。
形似这类题的问题叫做翻转问题,也可以叫开关问题,对于这类题通常都会用到下面所述的方法来解:
- 若某一个位置被翻转了n次,则其实际上被翻转了n%2次,因为翻转2k次相当与没翻转,翻转2k+1次相当于翻转了1次,因为要求最小翻转次数,所以对于某一个位置要么只(主动)翻转一次,要么不(主动)翻转。
- 分析易知翻转的顺序并不影响最终结果。(翻转i之后再翻转j 和 翻转j之后再翻转i 是相同的效果)
- 对于例题,现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只有翻转它自己,因为没有其他位置的翻转会引起它的翻转。若第1个位置为1则必须且进行翻转(并将其后2个进行连带翻转)且以后不再进行翻转,因为再进行翻转就一共翻转了2次相当于没翻转。然后着眼于第2个位置,由于第1个位置不再进行翻转,所以要想翻转第2个位置只有翻转它自己,因为没有其他位置的翻转会引起它的翻转.....................以此类推直至最后剩下的个数<3个,因为每次都翻转3个,而剩下的少于3个了就不再进行考虑了,此时只需判断剩下的是否全为0的即可,若不全为0,则不存在全部翻转为0的方案。
下面有几个题,当然赤裸裸套用上面方法是行不通的,在此基础上还需用到其他技巧
- POJ-3276(翻转问题+二分搜索)
- POJ-3279(翻转问题+位操作)
- POJ-1753(和3279没啥区别!)
- POJ-2965