首页 > 其他分享 >最大为N的数字组合

最大为N的数字组合

时间:2023-06-07 22:33:06浏览次数:33  
标签:digits return 数字 组合 int res memo limit 最大

给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。
例如,如果 digits = ['1','3','5'],我们可以写数字,如 '13', '551', 和 '1351315'。
返回 可以生成的小于或等于给定整数 n 的正整数的个数

1. 数位dp

class Solution {
public:
    int atMostNGivenDigitSet(vector<string>& digits, int n) {
        auto s = to_string(n); //转字符串逐位递归分析
        int m = s.length(), memo[m];
        memset(memo,-1,sizeof(memo));
        int notall = 0;
        function<int(int, int, bool)> f = [&](int i,bool prezero,bool is_limit) -> int {//视情况记录已遍历值的某种特征,如1的个数,mask状态,
            if (i == m) return !prezero;
            if (!is_limit&&memo[i]!= -1) //已经存储过,直接剪枝返回
                return memo[i];
            int res = 0; //计算1出现的个数
            if(prezero) notall += f(i+1,prezero,0);//单独处理前导0,同时不受限,含前导零的数需要单独计算
            int up = is_limit ? s[i] - '0' : 9; // 根据受限与否决定枚举数上界
            //做选择
            for (int d = 0; d < digits.size(); d++){ //遍历可选数
                    int cur = digits[d][0]-'0';
                    if(cur>up)  break;//剪枝
                    res += f(i + 1, 0, is_limit && cur == up);//移动到下一位,判断限制情况
            }
            if (!is_limit) //记录非限制数
                memo[i] = res;
            return res;
        };
        return f(0,true,true)+notall;   //从下标0开始,刚开始受限
    }
};

标签:digits,return,数字,组合,int,res,memo,limit,最大
From: https://www.cnblogs.com/929code/p/17464771.html

相关文章

  • 力扣---2336. 无限集中的最小数字
    现有一个包含所有正整数的集合[1,2,3,4,5,...]。实现SmallestInfiniteSet类:SmallestInfiniteSet()初始化SmallestInfiniteSet对象以包含所有正整数。intpopSmallest()移除并返回该无限集中的最小整数。voidaddBack(intnum)如果正整数num不存在于无限集中......
  • Ubuntu和MIUI时间显示秒数字
    Ubuntu(23.04)状态栏的时间显示秒,则需要执行以下命令mango@mango-ubuntu:~/Desktop$gsettingssetorg.gnome.desktop.interfaceclock-show-secondstrue小米手机(MIUI13)要展示时间到分秒可以打开时间悬浮窗功能即可。1.打开手机设置点击更多设置。2.点击页面下方的开发......
  • 猜数字
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){intx=100,d=0;stringa;cout<<"请想一个数"<<endl;system("pause");cout<<"你猜的这个数是:"<<(x-d)/2+d<<en......
  • AI猜数字
    #include<iostream>#include<cmath>usingnamespacestd;intmain(intargc,char**argv){ stringa; intmax=100,min=0; while(a!="对了"){ cout<<"猜是"<<(max-min)/2+min<<endl; cin>>a; if(a==&quo......
  • 架构师如何最大化自己的增量价值
    有的架构师不关注软件之外的事情,比如很少关心公司或部门的收入。这种性格虽然可以让他专注于软件工作,但从长期来看,如果不去思考如何通过技术为公司创造商业价值,那就很难保持或扩大自己在团队的影响力,职业发展也可能受挫。你可能听说过“在小数据里看大机会,在大数据里看小机会”这句......
  • 猜数字(角色互换)
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){stringa;intmax=100,min=0,x=1;cout<<"请在你心里想一个1~100的数字,我来猜"<<endl;system("pause");cout<<"第"<<x&......
  • 武汉星起航:亚马逊卖家的选品思维分享—打造成功的产品组合
    在亚马逊这样竞争激烈的电商平台上,卖家的选品决策至关重要。一个成功的产品组合能够为卖家带来销售增长和市场优势。以下是武汉星起航整理的亚马逊卖家应该具备的选品思维,以帮助他们做出明智的选品决策:深入市场研究:在选择产品之前,卖家应该进行深入的市场研究。了解目标市场的趋势、......
  • .net低代码开发平台 快速实现组织架构数字化
    在数字化时代,企业面临着巨大的转型挑战。数字化赋予了企业极大的流程优化和高效性,提供了以前难以想象的效率。数字化让企业可以通过机器学习、大数据、自动化流程等手段,实现更快、更精确的决策和反应性。其中,企业组织架构数字化尤为重要。数字化转型是企业的整体转型,是对企业业务......
  • 中企出海困难重重?海外税务数字化解决方案来支招!
    中企出海,目前面临重重阻碍因素,其中,海外税务管理尤为重要,数字化管理是刚需,今天来看看用友的海外税务数字化解决方案。从整体应用架构来看,数字化建模或者数据流程规则方面的管理是最底层基础,再往上是具体的应用领域,数字化解决方案可以覆盖海外税务管理的各个层面应用,包括海外税的合规......
  • 《大学物理实验上》期末笔记(二)有效数字特典
    《大学物理实验上》期末笔记(二)有效数字特典最头疼的一集有效数字测量值存在误差是不可避免的,因而测量值包含了准确数字和欠准数字。我们将准确数字和欠准数字总称为有效数字。在大学物理实验中,通常只取一位欠准数字,因此有效数字由若干位准确数字和一位欠准数字组成。有效数......