57. 爬楼梯(第八期模拟笔试) (kamacoder.com)
爬楼梯的进阶版?
一次可以爬多级阶梯,用完全背包就可以搞定
while True:
try:
n,m = map(int,input().split())
dp = [0] * (n+1)
dp[0] = 1
for j in range(0,n+1):
for i in range(1,m+1):
dp[j] += dp[j-i]
print(dp[n])
except EOFError:
break
零钱兑换,关键的还是递推公式,dp[j] = min(dp[j-nums[i]],dp[j])
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
if amount == 0:
return 0
dp = [inf] * (amount + 1)
dp[0] = 0
for i in range(len(coins)):
for j in range(coins[i],amount+1):
dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
if dp[amount] != inf:
return dp[amount]
else:
return -1
自己对于平方数的处理有点公式化了,想着必须先弄出来一个数组
class Solution:
def numSquares(self, n: int) -> int:
nums = []
for i in range(1,n+1):
if int(sqrt(i)) == sqrt(i):
nums.append(i)
dp = [inf] * (n+1)
dp[0]=0
print(nums)
for i in range(len(nums)):
for j in range(nums[i],n+1):
dp[j] = min(dp[j-nums[i]]+1,dp[j])
return dp[n]