题目大意:
给两个长度相等的数字串s1,s2。每次操作可以把连续的最多三位都+1或-1,如果超过9则变成0,如果小于0则变成9.问从s1到s2最少的步数。
解题思路:
每一位移动正确最多5位,如果一位一位的移动最多需要1000*5=5000 。
长度有1000太大,不能直接用BFS。
因为每次改变最多只影响3位,前面的i-3位不改变,所以可以设dp[i][j][k]表示处理到了第i位,且最后两位分别为j,k时,前面的i-2位为原串s1时,达到最终的s2的前i位时移动的最小的步数。
转移时,先把第i位移动正确,然后枚举在移动第i位时,前面两位可能到达的状态,此时第i-2位移动的步数要小于等于第i-1位的,第i-1位的要小于等于第i位的,然后根据dp[i-1]的状态更新dp[i]的状态。
比如有三位分别需要移动2 3 4位 第3位需要移动4位,在移动第3位时,可以先都移动2位,然后再后两位移动1位,最后一位再移动一位。
这类的dp做的比较少,以后多分析各种状态。
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include