跳转至

dp本质是递归

一 斐波那契数列【备忘录】

二 凑零钱问题-【最优子结构】

322. 零钱兑换 解出动规的问题,核心本质是要找出独立的最优子结构 这道题让我意识到dp也不一定需要数组来存。(当然这道题也可以,备忘录只是优化了搜索的一环) 记忆化搜索解法(超时):

class Solution {

public:
    int coinChange(vector<int>& coins, int amount) {
        return dp(coins,amount);
    }

    int dp(vector<int>& coins,int amount)
    {
        //base case
        if (amount == 0) return 0;
        if (amount < 0) return -1;
        int res = INT_MAX;
        for(int coin:coins)
        {
            //计算子问题的结果
            int subProblem = dp(coins,amount-coin);
            //子问题无解跳过
            if (subProblem == -1) continue;
            //子问题中选择最优解
            res = min(res,subProblem + 1);
        }
        return res == INT_MAX?-1:res;

    }

};

记忆化搜索带备忘录:

class Solution {
public:
    vector<int> memo;
    int coinChange(vector<int>& coins, int amount) {
        memo = vector<int> (amount + 1, -666);
        return dp(coins,amount);
    }
    int dp(vector<int>& coins,int
    {
        //base case
        if (amount == 0) return 0;
        if (amount < 0) return -1;
        if(memo[amount]!= -666)
            return memo[amount];
        int res = INT_MAX;
        for(int coin:coins)
        {
            //计算子问题的结果
            int subProblem = dp(coins,amount-coin);
            //子问题无解跳过
            if (subProblem == -1) continue;
            //子问题中选择最优解
            res = min(res,subProblem + 1);
        }
        res = (res == INT_MAX)?-1:res;
        memo[amount] = res;
        return res;
    }

};