dp,直接递推和记忆化搜索

 

leetcode 1553 吃掉N个橘子的最少天数

思路:除2或除3总比减一划算,所以先减掉余数再除。由于N很大,需要记忆化搜索;由于N很大,不能用数组,可以用unordered_map

class Solution {
public:
    // vector<int>dp;
    unordered_map<int, int>mp;
    int dfs(int n) {
        if(mp[n])  return mp[n];
        int& ans = mp[n];
        if(n == 0)  return ans=-1;  // 特殊,1需要1次,0最小需要-1次
        return ans = min(dfs(n/3)+n%3, dfs(n/2)+n%2)+1;
    }
    int minDays(int n) {
        // dp.resize(n+1, -1);
        return dfs(n);
    }
};
View Code

相关文章: