Use this to learn the idea, then write your own version.
123 45class Solution(object):6 def totalWaviness(self, num1, num2):7 """8 :type num1: int9 :type num2: int10 :rtype: int11 """12 def count(x):13 def dp(i, prev, prev2, zero, tight):14 if i == len(s):15 return 1, 016 key = (i, prev, prev2, zero, tight)17 if key not in lookup:18 cnt = w = 019 mx = int(s[i]) if tight else 920 for d in xrange(mx+1):21 new_tight = tight and (d == int(s[i]))22 new_zero = zero and (d == 0)23 new_prev2 = prev24 new_prev = d if not new_zero else -125 new_cnt, nw = dp(i+1, new_prev, new_prev2, new_zero, new_tight)26 cnt += new_cnt27 if not zero and prev2 != -1 and (prev2 < prev and prev > d or prev2 > prev and prev < d):28 w += new_cnt29 w += nw30 lookup[key] = (cnt, w)31 return lookup[key]32 33 s = str(x)34 lookup = {}35 return dp(0, -1, -1, True, True)[1]36 37 return count(num2)-count(num1-1)38 39 40414243class Solution2(object):44 def totalWaviness(self, num1, num2):45 """46 :type num1: int47 :type num2: int48 :rtype: int49 """50 def count(x):51 def encode(i, prev, prev2, zero, tight):52 key = i53 key = key*(10+1)+(prev+1)54 key = key*(10+1)+(prev2+1)55 key = key*2+(1 if zero else 0)56 key = key*2+(1 if tight else 0)57 return key58 59 def dp(i, prev, prev2, zero, tight):60 if i == len(s):61 return 1, 062 key = encode(i, prev, prev2, zero, tight)63 if lookup[key] is None:64 cnt = w = 065 mx = int(s[i]) if tight else 966 for d in xrange(mx+1):67 new_tight = tight and (d == int(s[i]))68 new_zero = zero and (d == 0)69 new_prev2 = prev70 new_prev = d if not new_zero else -171 new_cnt, nw = dp(i+1, new_prev, new_prev2, new_zero, new_tight)72 cnt += new_cnt73 if not zero and prev2 != -1:74 if (prev2 < prev and prev > d) or (prev2 > prev and prev < d):75 w += new_cnt76 w += nw77 lookup[key] = (cnt, w)78 return lookup[key]79 80 s = str(x)81 lookup = [None]*(len(s)*(10+1)*(10+1)*2*2)82 return dp(0, -1, -1, True, True)[1]83 84 return count(num2)-count(num1-1)85 86 87888990class Solution3(object):91 def totalWaviness(self, num1, num2):92 """93 :type num1: int94 :type num2: int95 :rtype: int96 """97 def count(x):98 s = str(x)99 dp = {}100 for prev in xrange(-1, 10):101 for prev2 in xrange(-1, 10):102 for zero in xrange(2):103 for tight in xrange(2):104 dp[(prev, prev2, zero, tight)] = (1, 0)105 for i in reversed(xrange(len(s))):106 new_dp = {}107 for prev in xrange(-1, 10):108 for prev2 in xrange(-1, 10):109 for zero in xrange(2):110 for tight in xrange(2):111 cnt = w = 0112 mx = int(s[i]) if tight else 9113 for d in xrange(mx+1):114 new_tight = tight and (d == int(s[i]))115 new_zero = zero and (d == 0)116 new_prev2 = prev117 new_prev = d if not new_zero else -1118 key = (new_prev, new_prev2, new_zero, new_tight)119 if key in dp:120 new_cnt, nw = dp[key]121 cnt += new_cnt122 if not zero and prev2 != -1 and ((prev2 < prev and prev > d) or (prev2 > prev and prev < d)):123 w += new_cnt124 w += nw125 new_dp[(prev, prev2, zero, tight)] = (cnt, w)126 dp = new_dp127 return dp[(-1, -1, True, True)][1]128 129 return count(num2)-count(num1-1)130 131 132133134135class Solution4(object):136 def totalWaviness(self, num1, num2):137 """138 :type num1: int139 :type num2: int140 :rtype: int141 """142 def count(x):143 def encode(prev, prev2, zero, tight):144 key = prev+1145 key = key*(10+1)+(prev2+1)146 key = key*2+(1 if zero else 0)147 key = key*2+(1 if tight else 0)148 return key149 150 s = str(x)151 state_size = (10+1)*(10+1)*2*2152 dp = [None]*state_size153 for prev in xrange(-1, 10):154 for prev2 in xrange(-1, 10):155 for zero in xrange(2):156 for tight in xrange(2):157 key = encode(prev, prev2, zero, tight)158 dp[key] = (1, 0)159 for i in reversed(xrange(len(s))):160 new_dp = [None]*state_size161 for prev in xrange(-1, 10):162 for prev2 in xrange(-1, 10):163 for zero in xrange(2):164 for tight in xrange(2):165 cnt = w = 0166 mx = int(s[i]) if tight else 9167 for d in xrange(mx+1):168 new_tight = tight and (d == int(s[i]))169 new_zero = zero and (d == 0)170 new_prev2 = prev171 new_prev = d if not new_zero else -1172 key = encode(new_prev, new_prev2, new_zero, new_tight)173 if dp[key] is not None:174 new_cnt, nw = dp[key]175 cnt += new_cnt176 if not zero and prev2 != -1 and ((prev2 < prev and prev > d) or (prev2 > prev and prev < d)):177 w += new_cnt178 w += nw179 new_dp[encode(prev, prev2, zero, tight)] = (cnt, w)180 dp, new_dp = new_dp, dp181 return dp[encode(-1, -1, True, True)][1]182 183 return count(num2)-count(num1-1)184