0
点赞
收藏
分享

微信扫一扫

Python leetcode 2906 构造乘积矩阵,力扣练习,矩阵递推,经典递推题目,递推代码实战

mjjackey 2024-04-22 阅读 6
算法

1049. 最后一块石头的重量 II

题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之背包问题,这个背包最多能装多少?LeetCode:1049.最后一块石头的重量II哔哩哔哩bilibili

思路:

class Solution:
    def lastStoneWeightII(self, stones: List[int]) -> int:

        sum_ = sum(stones)
        target = sum_ // 2
        dp = [0] * (target + 1)
        
        # 动态规划更新
        for stone in stones:
            for j in range(target, stone - 1, -1):
                dp[j] = max(dp[j], dp[j - stone] + stone)

        # 计算最小可能的石头重量
        return (sum_ - dp[target]) - dp[target]

494. 目标和

题目链接:494. 目标和 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之背包问题,装满背包有多少种方法?| LeetCode:494.目标和哔哩哔哩bilibili

思路:

class Solution:
    def findTargetSumWays(self, nums: List[int], target: int) -> int:
        # 计算nums的总和
        total_sum = sum(nums)
        # 此时没有方案
        if abs(target) > total_sum:
            return 0
        if (target + total_sum) % 2 == 1:
            return 0

        # 加法和
        add_sum = (target + total_sum) // 2
        # 创建动态规划数组,初始化为0
        dp = [0]*(add_sum+1)
        # 当目标和为0时,只有一种方案,即什么都不选
        dp[0] = 1

        # print(dp)
        for num in nums:
            for j in range(add_sum,num -1 ,-1):
                print(num,j)
                # 状态转移方程,累加不同选择方式的数量
                dp[j] = dp[j] + dp[j-num]
            # print(dp)
        # 返回达到目标和的方案数
        return dp[-1]

474.一和零

题目链接:474. 一和零 - 力扣(LeetCode)

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零哔哩哔哩bilibili

思路:

class Solution:
    def findMaxForm(self, strs: List[str], m: int, n: int) -> int:
        dp = [[0] * (n + 1) for _ in range(m + 1)]  # 创建二维动态规划数组,初始化为0
        # print(dp)
        # 遍历物品
        for s in strs:
            ones = s.count('1')  # 统计字符串中1的个数
            zeros = s.count('0')  # 统计字符串中0的个数
            # 遍历背包容量且从后向前遍历
            for i in range(m, zeros - 1, -1):
                for j in range(n, ones - 1, -1):
                    # 状态转移方程,符合要求,就在dp[i - zeros][j - ones]上加1,不符合要求就继承原来的值
                    dp[i][j] = max(dp[i][j], dp[i - zeros][j - ones] + 1)
            # print(dp)
        return dp[m][n]
举报

相关推荐

0 条评论