卡码网:57. 爬楼梯:
跟昨天第三题一样,求排列数,先2阶后1阶算是两种方法。
def Stairs(n, m):
dp = [0] * (n + 1)
dp[0] = 1
for j in range(1, n + 1):
for i in range(1, m + 1):
if j - i >= 0:
dp[j] += dp[j - i]
return dp[n]
if __name__ == '__main__':
n, m = map(int, input().strip().split())
print(Stairs(n, m))
322. 零钱兑换:
求组和总和最小,内外循环顺序不影响结果。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [float('inf')] * (amount + 1)
dp[0] = 0
for coin in coins:
for j in range(coin, amount + 1):
dp[j] = min(dp[j], dp[j - coin] + 1)
return dp[amount] if dp[amount] <= amount else -1
279. 完全平方数
第一感觉...三平方和定理...n年前搞竞赛时候杂志上读到的没ruan用的结论...
数论方法:
最坏情况O(n)时间复杂度,哦莫,优雅。
class Solution:
def numSquares(self, n: int) -> int:
def isPerfectSquare(x):
return int(math.sqrt(x)) ** 2 == x
def checkAnswer4(n):
while n % 4 == 0:
n //= 4
return n % 8 == 7
if isPerfectSquare(n):
return 1
if checkAnswer4(n):
return 4
for i in range(1, int(math.sqrt(n)) + 1):
if isPerfectSquare(n - i*i):
return 2
return 3
动态规划:
动规也很简单,跟上一题不能说一模一样,至少完全相同。
class Solution:
def numSquares(self, n: int) -> int:
m = int(math.sqrt(n))
dp = [float('inf')] * (n + 1)
dp[0] = 0
for i in range(1, m + 1):
for j in range(i ** 2, n + 1):
dp[j] = min(dp[j], dp[j - i ** 2] + 1)
return dp[n]
今日总结:
简单简单简单!!
如果每遇到一道题都可以告诉我用什么算法解决那就好了!!!
本文介绍了使用动态规划解决的三个编程问题:计算楼梯的不同走法、零钱兑换的最少硬币组合以及判断完全平方数的方法。作者强调了动态规划在这些问题中的应用,并表达了对遇到具体算法解决方法的渴望。
423

被折叠的 条评论
为什么被折叠?



