From aeb80ae90a24ecd67593867b20507c07dd7dab50 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Sat, 21 Jan 2023 13:22:09 -0600 Subject: [PATCH 1/3] dp python --- problems/0509.斐波那契数.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md index 1fa5ca18..69306801 100644 --- a/problems/0509.斐波那契数.md +++ b/problems/0509.斐波那契数.md @@ -214,6 +214,33 @@ class Solution: a, b = b, c return c +# 动态规划 (注释版。无修饰) +class Solution: + def fib(self, n: int) -> int: + + # 排除 Corner Case + if n == 1: + return 1 + + if n == 0: + return 0 + + # 创建 dp table + dp = [0] * (n + 1) + + # 初始化 dp 数组 + dp[0] = 0 + dp[1] = 1 + + # 遍历顺序: 由前向后。因为后面要用到前面的状态 + for i in range(2, n + 1): + + # 确定递归公式/状态转移公式 + dp[i] = dp[i - 1] + dp[i - 2] + + # 返回答案 + return dp[n] + # 递归实现 class Solution: def fib(self, n: int) -> int: From 88750b119003658587b9e03ff3b6f0e525d665c2 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Mon, 23 Jan 2023 17:43:15 -0600 Subject: [PATCH 2/3] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=8C=E7=BB=B4?= =?UTF-8?q?=E6=95=B0=E7=BB=84=E8=A7=A3=E6=B3=95=20+=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0416.分割等和子集.md | 47 ++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md index ecee1d83..936ba270 100644 --- a/problems/0416.分割等和子集.md +++ b/problems/0416.分割等和子集.md @@ -291,18 +291,63 @@ false true false false false true true false false false true true ### Python: ```python +# 一维度数组解法 class Solution: def canPartition(self, nums: List[int]) -> bool: target = sum(nums) if target % 2 == 1: return False target //= 2 - dp = [0] * 10001 + dp = [0] * (len(nums) + 1) for i in range(len(nums)): for j in range(target, nums[i] - 1, -1): dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]) return target == dp[target] ``` +```python +# 二维度数组解法 +class Solution: + def canPartition(self, nums: List[int]) -> bool: + target = sum(nums) + nums = sorted(nums) + + # 做最初的判断 + if target % 2 != 0: + return False + + # 找到 target value 可以认为这个是背包的体积 + target = target // 2 + + row = len(nums) + col = target + 1 + + # 定义 dp table + dp = [[0 for _ in range(col)] for _ in range(row)] + + # 初始 dp value + for i in range(row): + dp[i][0] = 0 + + for j in range(1, target): + if nums[0] <= j: + dp[0][j] = nums[0] + + # 遍历 先遍历物品再遍历背包 + for i in range(1, row): + + cur_weight = nums[i] + cur_value = nums[i] + + for j in range(1, col): + if cur_weight > j: + dp[i][j] = dp[i - 1][j] + else: + dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight] + cur_value) + + # 输出结果 + return dp[-1][col - 1] == target +``` + ### Go: ```go // 分割等和子集 动态规划 From 27ba94b581236d83b1778f93778f2ae57bc7e874 Mon Sep 17 00:00:00 2001 From: Logen <47022821+Logenleedev@users.noreply.github.com> Date: Wed, 25 Jan 2023 12:46:13 -0600 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/1049.最后一块石头的重量II.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md index bf4e708a..3b2c33c1 100644 --- a/problems/1049.最后一块石头的重量II.md +++ b/problems/1049.最后一块石头的重量II.md @@ -224,7 +224,7 @@ class Solution: def lastStoneWeightII(self, stones: List[int]) -> int: sumweight = sum(stones) target = sumweight // 2 - dp = [0] * 15001 + dp = [0] * (target + 1) for i in range(len(stones)): for j in range(target, stones[i] - 1, -1): dp[j] = max(dp[j], dp[j - stones[i]] + stones[i])