目录

Leetcode-刷题笔记1-动态规划part06

Leetcode 刷题笔记1 动态规划part06

leetcode 322 零钱兑换

由于本题所求为最少零钱数所以递推公式中应该为dp[ j ] = min(dp[ j ], dp[ j - coin] + 1)

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):
                if dp[j - coin] != float('inf'):
                    dp[j] = min(dp[j], dp[j - coin] + 1)
        if dp[amount] == float('inf'):
            return -1 
        return dp[amount]

leetcode 279 完全平方数

需要注意物品的上界

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')] * (n + 1)
        dp[0] = 0
        squr = int(n ** 0.5)
        for i in range(1, squr + 1):
            i *= i
            for j in range(i, n + 1):
                dp[j] = min(dp[j], dp[j - i] + 1)
        return dp[n]

leetcode 139 单词拆分

对于字符串的处理还不熟练

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        wordSet = set(wordDict)
        n = len(s)
        dp = [False] * (n + 1)
        dp[0] = True
        for i in range(1, n + 1):
            for j in range(i):
                if dp[j] and s[j: i] in wordSet:
                    dp[j] = True
                    break 
        return dp[n]