dp总结篇

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
复制代码

数位DP

leetcode 902 最大为N的数组组合

思路:数位dp,逐位考虑,同时记录前面的一些必要信息。pre记录是否已经小于,flag记录前面是否是全0. (细节挺多,每种情况都要考虑到,到最后发现很多情况能合并)

复制代码
class Solution {
public:
    typedef long long  ll;
    ll qpow(ll a, ll b) {
        ll ret = 1;
        while(b) {
            if(b&1) ret *= a;
            b >>= 1;
            a *= a;
        }
        return  ret;
    }
    ll dfs(vector<string>& digits, vector<int>& limits, int pos, bool pre, bool flag) { // 
        // cout << "pos: " << pos << endl;
        int n = digits.size(), m = limits.size();
        if(pos >= m)  return !flag;
        int limit = limits[pos];
        ll ret = 0;
        // 前面小
        if(pre)
        {
            // 填0
            if(flag)  ret += dfs(digits, limits, pos+1, pre, flag);
            // 不填0
            ret += qpow(n, m-pos);
        } else { // 前面等
            int i = 0;
            for(;i < n;i++)
                if(stoi(digits[i]) >= limit)  break;

            // 填limit
            if(i < n && stoi(digits[i]) == limit)  ret += dfs(digits, limits, pos+1, pre, false);
            // 填0
            if(flag)  ret += dfs(digits, limits, pos+1, true, flag);
            // 填(0, limit)
            ret += i*qpow(n, m-pos-1);
        }
    
        return ret;
    }
    int atMostNGivenDigitSet(vector<string>& digits, int n) {
        int tmp = n;
        vector<int>limits;
        while(tmp) {
            limits.insert(limits.begin(), tmp%10);
            tmp /= 10;
        }

        // for(int num : limits)  cout << num << " ";
        ll ans = dfs(digits, limits, 0, false, true);

        return ans;
    }
};
View Code
复制代码

 

posted @   Rogn  阅读(60)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-03-25 leetcode面试题16.24-在无序数组中所有发现和为sum的数对
2020-03-25 map底层为什么要用红黑树实现
2020-03-25 I/O复用
2020-03-25 五大IO模型
2019-03-25 Python-OpenCV中图像合并显示
2019-03-25 Python-OpenCV——Image Blurring(Image Smoothing)
2019-03-25 Python-OpenCV中的resize()函数
点击右上角即可分享
微信分享提示