- 代码随想录-动规19.LC518.零钱兑换II
完全背包组合问题,先i再j遍历 - 代码随想录-动规21.LC377. 组合总和 Ⅳ
完全背包排列问题,先j再i遍历
3. 代码随想录-动规26.LC139单词拆分
如果不当背包做:
外层i=0,内层j=i+1,只要substring(i,j)在字典里出现,dp[j]标为true,i=j重新开始一个遍历。返回最后一个dp[j]。
这种做法会忽视掉如下情况:
输入: s = “leetcode”, wordDict = [“leet”, “leetcode”]。如果用上述做法输出为false。
当背包做:
完全背包,有排列,所以先j后i
dp[j]表示长度为j是否能被构成。初始化dp[0]=true
代码
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int j = 1; j <= s.length(); j++) {
for (String word : wordDict) {
int len = word.length();
if (j >= len && dp[j - len] && word.equals(s.substring(j - len, j))) {
dp[j] = true;
break;
}
}
}
return dp[s.length()];
}
}
4. 代码随想录-动规29.打家劫舍
不需要用背包。最简单动规递推。
注意初始化及考虑临界条件。
5.代码随想录-动规30.打家劫舍2
定义两个dp,比较dp末尾大小