classSolution: defminCostClimbingStairs(self, cost: List[int]) -> int: # 空间优化 f0, f1 = 0, 0 n = len(cost) for i inrange(2, n+1): f0, f1 = f1, min(f0+cost[i-2], f1+cost[i-1]) return f1
# 递推 f[i] = min(f[i-1]+cost[i-1], f[i-2]+cost[i-2]) n = len(cost) f = [0]*(n+1) for i inrange(2, n+1): f[i] = min(f[i-1]+cost[i-1], f[i-2]+cost[i-2]) return f[-1]
# 记忆化搜索 n = len(cost) @cache defdfs(i:int)->int: # i 是爬完前i个台阶的最小花费 if i <= 1: return0 returnmin(dfs(i-1)+cost[i-1], dfs(i-2)+cost[i-2]) return dfs(n)
classSolution: defdeleteAndEarn(self, nums: List[int]) -> int: rec = [0]*10001 for num in nums: rec[num] += num @cache defdfs(i:int): if i < 0: return0 returnmax(dfs(i-2)+rec[i], dfs(i-1)) return dfs(10000)
classSolution: defcountGoodStrings(self, low: int, high: int, zero: int, one: int) -> int: # 递推 f[i]= (f(i-zero) if i >= zero else 0) + (f(i-one) if i >= one else 0) ans = 0 MOD = int(1e9+7) f = [0]*(high+1) f[0]=1 for i inrange(1, high+1): f[i] = (f[i-zero] if i >= zero else0) + (f[i-one] if i >= one else0) f[i] %= MOD if i >= low: ans += f[i] ans %= MOD return ans # 记忆化搜索 ans = 0 MOD = int(1e9+7) @cache defdfs(i:int)->int: if i == 0: return1# 刚好用完才算一个串 nonlocal ans res = (dfs(i-zero) if i >= zero else0) + (dfs(i-one) if i >= one else0) # print(i, res) if i >= low: ans += res ans %= MOD return res dfs(high) return ans % MOD
classSolution: defcombinationSum4(self, nums: List[int], target: int) -> int: # 递推 f[i] = sum((f[i-num] if i>=num else 0) for num in nums) nums.sort() f = [0]*(target+1) f[0] = 1 for i inrange(1, target+1): for num in nums: if num > i: break f[i] += f[i-num] return f[-1] # 记忆化搜索 nums.sort() n = len(nums) @cache defdfs(target:int): if target <= 0: return1if target == 0else0 res = 0 for i inrange(n): num = nums[i] if num > target: break res += dfs(target-num) return res return dfs(target)
classSolution: defcountTexts(self, pressedKeys: str) -> int: MOD = int(1e9+7) # 本质上就是算每个相同的数字段可能衍生的数值变化相乘 # 递推 f3, f4 = [0]*100001, [0]*100001 f3[0], f4[0] = 1, 1 for i inrange(1, 100001): f3[i] = sum([ f3[i-1], f3[i-2] if i > 1else0, f3[i-3] if i > 2else0, ])%MOD f4[i] = sum([ f4[i-1], f4[i-2] if i > 1else0, f4[i-3] if i > 2else0, f4[i-4] if i > 3else0, ])%MOD
continous_len = 0 cur_char = pressedKeys[0] ans = 1 for c in pressedKeys: if c == cur_char: continous_len += 1 else: ans = (ans*f4[continous_len] if cur_char in ["7", "9"] else ans*f3[continous_len])%MOD # print(ans, continous_len) cur_char = c continous_len = 1 ans = (ans*f4[continous_len] if cur_char in ["7", "9"] else ans*f3[continous_len])%MOD return ans
# 记忆化搜索 @cache defdfs(i:int, step:int): # step是这个按键可对应几个字母 if i <= 0: # 刚好用完算一个组合 return1if i == 0else0 res = 0 for j inrange(1, min(i, step)+1): res += dfs(i-j, step) # print(i, step, res) return res
continous_len = 0 cur_char = pressedKeys[0] ans = 1 for c in pressedKeys: if c == cur_char: continous_len += 1 else: ans = (ans*dfs(continous_len, 4if cur_char in ["7", "9"] else3))%MOD # print(ans, continous_len) cur_char = c continous_len = 1 ans = (ans*dfs(continous_len, 4if cur_char in ["7", "9"] else3))%MOD return ans