一、零钱兑换
和上楼梯一样,不难想
注意这里是min,注意初始化
代码:
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,INT_MAX);
dp[0]=0;
for(int i=0;i<coins.size();i++)
{
for(int j=coins[i];j<=amount;j++)
{
if (dp[j - coins[i]] != INT_MAX)
//这里是min,所以初始化为最大值
dp[j]=min(dp[j-coins[i]]+1,dp[j]);
}
}
if(dp[amount]==INT_MAX) return -1;
return dp[amount];
}
};
二、单词拆分
用字典装满背包
递推公式:看上一个dp是否为true,并判断这一段的单词是否在字典里找的到
dp是从1开始的
s字符串是从0开始的
leetcode “leet” “code”
dp[5]看 dp[0]是否为true 和[0-5)这个单词是否找的到
dp[1]是否为true 和[1-5)这个单词是否找的到
dp[2]是否为true 和[2-5)这个单词是否找的到
dp[3]是否为true 和[3-5)这个单词是否找的到
dp[4]是否为true 和[4-5)这个单词是否找的到(这里的[4-5)指的是"c"字母)
代码:
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
//哈希表:查看元素是否在集合内
unordered_set<string> word(wordDict.begin(), wordDict.end());
//dp[j]s中从1个字母到第j个字母是否能被找到(不是第0个)
vector<bool> dp(s.size()+1, false);
dp[0] = true;
for (int i = 1; i <= s.size(); i++) {
for (int j = 0; j < i; j++) {
string word = s.substr(j, i - j);
if (word.find(word) != word.end() && dp[j]) {
dp[i] = true;
}
}
}
return dp[s.size()];
}
};