diff --git "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" index 2015cb90c1..8eff126eac 100755 --- "a/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" +++ "b/problems/0139.\345\215\225\350\257\215\346\213\206\345\210\206.md" @@ -211,6 +211,8 @@ public: ## 拓展 +### 1. 关于遍历顺序 + 关于遍历顺序,再给大家讲一下为什么 先遍历物品再遍历背包不行。 这里可以给出先遍历物品再遍历背包的代码: @@ -249,6 +251,67 @@ public: 如果大家对这里不理解,建议可以把我上面给的代码,拿去力扣上跑一跑,把dp数组打印出来,对着递推公式一步一步去看,思路就清晰了。 + +### 2. 动态规划的更优解 + +动态规划五部曲: + +1.确定dp[j]下标及含义:定义dp[j]为使用字符串字典的[0,i]字符串可以拼成 s 的前 j 个字符串s[0:j)的长度 + +2.确定递推公式 + +定义当前遍历的物品字符串wordDict[i]的长度为len, 以及接下来要拼接的位置idx为`idx=max(dp[j], dp[j-len])`,当且仅当: + +① 拼接完这个物品字符串后长度刚好为j`idx+len==j` + +②当前物品字符串wordDict[i]完全匹配接下来要拼接的每个位置: `s[idx:idx+len)=str[i][0:len)` + +上述两个条件都满足时更新`dp[j]=dp[idx]+len` + +3.确定遍历顺序,上面强调过了,这是一个排列问题,for的遍历顺序为先背包后物品 + +4.初始化:全部初始化为0 + +5.举例推导 + +AC代码: +``` +class Solution { +public: + bool wordBreak(string s, vector& wordDict) { + int dp[305]={0}; + for(int j=1; j<=s.length(); j++){ + for(int i=0; i