动态规划(5)

279完全平方数

  1. 对于遍历顺序,因为数字可以重复出现所以j从小到大
  2. 对于初始化我们要求最小值所以除了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单词拆分

感觉已经上道了,能写出这种长的判断表达式

  1. dp[j]的含义,长度为j的目标串能否被worddict拼出
  2. 初始化,除了dp[0]其他的都为0,如果dp[0]是0,那么全部的表达式都会为0
  3. 遍历顺序,先遍历背包,再遍历物品,因为我们要把上一个状态中,所有能使dp[]置为1的状态都算出来
  4. 递推公式,对于当前的背包大小,遍历字符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];

    }
};

posted @ 2024-01-19 15:01  LiviaYu  阅读(6)  评论(0)    收藏  举报