String painter
题目大意
给你a,b两个长度相等的字符串,每次操作可以选择将a的一个区间全变成同一个字符,求将a变成b的最小操作次数
题目思路:
首先考虑最坏的情况,无非是不考虑a字符,都一个一个变,这样操作次数为n。那么在这样的操作方案下,可以想到,"每次只替换一个字符"可以等价于"每次替换一个区间然后这个区间的其他字符再被其它操作选择性覆盖",只要区间选得合适,那么后面的操作就可以不用替换掉这个字符从而节省操作。可以想到只要选取两端点相同的区间就行,这样可以节省一次操作。如果a[i]==b[i]本就不用替换,那么究竟是否还依然要选择一个两端点相等的区间呢?如果本就不用替换,其实选择一个区间a[i,k]替换与只选择a[k]替换都是同样的操作,我们可以只选择a[k]替换,也就是当a[i]==b[i]时就不用管i了。设dp[l,r]为区间[l,r]的最小操作次数,则if(a[l]!=b[l]) {dp[l,r]=r-l+1,if(b[l]==b[k]) dp[l,r]=min(dp[l,r],dp[l+1,k-1]+1+dp[k+1,r])}