目录
279完全平方数
- 对于遍历顺序,因为数字可以重复出现所以j从小到大
- 对于初始化我们要求最小值所以除了dp[0]=0,其他的都是一个大值
class Solution {
public:
//dp[j]何为j的完全平方数的最小数量
int numSquares(int n) {
vector<int> dp(n+1,1000);
dp[0]=0;
for(int i=0;i<=sqrt(n);i++)
{
for(int j=i*i;j<=n;j++)
{
dp[j]=min(dp[j],dp[j-i*i]+1);
}
}
return dp[n];
}
};
139单词拆分
感觉已经上道了,能写出这种长的判断表达式
- dp[j]的含义,长度为j的目标串能否被worddict拼出
- 初始化,除了dp[0]其他的都为0,如果dp[0]是0,那么全部的表达式都会为0
- 遍历顺序,先遍历背包,再遍历物品,因为我们要把上一个状态中,所有能使dp[]置为1的状态都算出来
- 递推公式,对于当前的背包大小,遍历字符word,如果dp[j-word长度]为true且j之后到当前index的字串等于word,那么就说明能凑出dp,置为true
当然,如果当前dp本身就是true,那就直接是true
class Solution {
public:
//dp[j]的含义,长度为j的目标串能否被worddict拼出
bool wordBreak(string s, vector<string>& wordDict) {
int slen=s.length();
int n=wordDict.size();
vector<bool> dp(slen+1,false);
dp[0]=true;
for(int i=1;i<=slen;i++)
{
for(int j=0;j<n;j++)
{
if(i>=wordDict[j].length())
dp[i]=dp[i]||(dp[i-wordDict[j].length()]&&s.substr(i-wordDict[j].length(),wordDict[j].length())==wordDict[j]);
}
}
return dp[slen];
}
};
标签:遍历,int,规划,length,wordDict,动态,true,dp
From: https://www.cnblogs.com/liviayu/p/17974650