数位dp学习

news2024/11/13 23:34:39

参考借鉴:

数位DP学习整理(数位DP看完这篇你就会了)-CSDN博客

AcWing1081.度的数量(数位DP)题解_求给定区间$ [x,y]$ 中满足下列条件的整数个数:这个数恰好等于 k k k 个互不相等-CSDN博客

 

就是类似前缀和的思想,进行数字在位数上的前缀操作,以此dp来简化暴力计算的方法;

例题一:

求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的 B的整数次幂之和。例如,设 X = 15 , Y = 20 , K = 2 , B = 2 ,则有且仅有下列三个数满足题意:
17=2^{4}+2^{0}

18=2^{4}+2^{1}

20=2^{4}+2^{2}
输入格式
第一行包含两个整数 X 和 Y,接下来两行包含整数 K和 B。
输出格式
只包含一个整数,表示满足条件的数的个数。
数据范围
1 ≤ X ≤ Y ≤ 2^{31}-1
1 ≤ K ≤ 20
2 ≤ B ≤ 10
输入样例:
15 20
2
2
输出样例:
3

 解题思路:
首先将N转化为b进制数,则一个数能由b的整数次方合成,则转化为b进制后,对应的b的次方的位置为1, 那么我们只需判断转化为b进制后,各个位数上0,1的个数就可以,得到总的方案数;

假设 N 转化为 b 进制后有 n 位数,从最高位开始遍历,当前位的数为 x, 枚举填 0 和填 1 的方案:

1.如果 x == 0,直接跳过(不能由b的多少次方组成)

2.如果x == 1, 当前位置 i 可以填0, 还需要填 k 个 1 ,则需要从剩下的 i - 1 位中填 k 个 1 ,即C(i - 1, k), 并让x =1,继续判断下一位;

3.如果x > 1, 则该位上可以填 0 ,方案数为C(i - 1, k), 也可以填 1 ,即方案数为C(i - 1, k - 1), 因为填大于 1 的数不合法,所以直接break掉

4.判断 i 是否等于 0,即判断i是否为最后一位, 如果是的话, 那么最后以后可以填 0 , ans++;f(i, j)表示从i个数里面选j个数的方案数,预处理出每一位上左分支的方案数

//首先我们先预处理f数组。其中f[i][j]表示剩下还有i个没填,需要填写j个1的方案数。
void init(){
    for(int i=0;i<35;i++){
        for(int j=0;j<=i;j++){
            if(!j)f[i][j]=1;
            else{
                f[i][j]=f[i-1][j]+f[i-1][j-1];
            }
        }
    }
}

上述代码描述了填写内容的转移关系

 完整代码:

#include <bits/stdc++.h>
#include <iostream>  
#include <vector>  
#include <string>  
#include <unordered_set>  
#include <cmath>  

using namespace std;

typedef long long ll;
const int maxn = 100000 + 5;
const int mod = 1e9+7;

int l=15,r=20,k=2,b=2;
int f[35][35];
//首先我们先预处理f数组。其中f[i][j]表示剩下还有i个没填,需要填写j个1的方案数。
void init(){
    for(int i=0;i<35;i++){
        for(int j=0;j<=i;j++){
            if(!j)f[i][j]=1;
            else{
                f[i][j]=f[i-1][j]+f[i-1][j-1];
            }
        }
    }
}
int dp(int n){
    //求解f(n)。我们需要避免n为0的情况,这里需要特判。
    if(!n)return 0;
    vector<int> nums;//将n分割,存储位数。
    while(n){
        nums.push_back(n%b);
        n/=b;
    }
    int ans=0;//答案。
    int last=0;//前面的信息,这里代表的是前面分支选取了多少个1.
    for(int i=nums.size()-1;i>=0;i--){
        int x=nums[i];
        if(x){
            //说明x>0,我们可以选择左边分支填0.
            ans+=f[i][k-last];
            if(x>1){
                //当x>1我们才可以枚举左边分支填1.
                if(k-last-1>=0){
                    //如果还可以填1的话。
                    ans+=f[i][k-last-1];
                }
                break;//因为右边分支只能为0或1,所以不符合条件。break。
            }
            else{
                //当x=1就可以进入右边的分支继续讨论。
                last++;
                if(last>k)break;
            }
        }
        //考虑到最后一位,如果符合条件那么末位填0也算一种方案。
        if(!i&&last==k)ans++;
    }
    return ans;
}
void solve(){
}
int main(){
    // cin>>l>>r>>k>>b;
    int l=15,r=20,k=2,b=2;
    init();
    cout<<dp(r)-dp(l-1)<<endl;
    solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1982457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最新资讯 | 开源大模型Llama会失去技术优势吗?

昨夜&#xff0c;Meta宣布推出迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;支持上下文长度为128K Tokens&#xff0c;在基于15万亿个Tokens、超1.6万个H100 GPU上进行训练&#xff0c;这也是Meta有史以来第一次以这种规模训练Llama模型。Meta同时还发布了全新升级的…

2024年,pdf文献热门翻译软件总结推荐

对于如今的时代&#xff0c;市面上存在各式各样的学术资料&#xff0c;对于没有语言天赋的我&#xff0c;看得眼花缭乱。看个学术资料都不知道要用哪个工具&#xff0c;试来试去和睦浪费时间。今天就我使用过的翻译软件中&#xff0c;整理了四款能帮助我们解决文献翻译难题的四…

未授权访问漏洞系列详解⑧!

Druid未授权访问漏洞 漏洞特征:http://www.xxxx.com/druid/index.html 当开发者配置不当时就可能造成未授权访问下面给出常见Druid未授权访问路径 ------------- /druid/websession.html /system/druid/websession.html /webpage/system/druid/websession.html(jeecg) ----…

GitHub惊天安全漏洞:删除的仓库竟能永远访问

引言 近日&#xff0c;GitHub 被曝出一个严重的安全漏洞&#xff0c;引发了广泛关注。开源安全软件公司 Truffle Security 的安全研究员 Joe Leon 发现&#xff0c;在 GitHub 上删除的代码仓库实际上仍然可以被访问。这一发现震惊了整个开源社区。本文将详细探讨这一安全漏洞的…

PXE服务器自助部署

kickstart部分 一、实验环境 两台主机&#xff1a;一台用于环境搭建&#xff08;ngnix.yee.org&#xff09;&#xff0c;一台用于测试(check_ks)。测试机 二、开启主机图形工具&#xff0c;并进行基本配置 查看 /root/anaconda-ks.cfg 文件&#xff0c;这个文件是系统安装以…

学习记录——day26 进程间的通信(IPC)无名管道 无名管道 信号通信 特殊的信号处理

目录 一、进程间通信引入 二、无名管道 1、无名管道相关概念 2、无名管道的API接口函数 pipe(int pipefd[2]); 3、管道通信的特点 4、管道的读写特点 三、无名管道 1、有名管道&#xff1a;有名字的管道文件&#xff0c;其他进程可以调用 2、可以用于亲缘进程间的通信&…

windows下,使用vs code远程连接云服务器【以CentOS7为例】

windows下&#xff0c;使用vs code远程连接云服务器 1. 下载VS code并准备相关插件2. 使用Remote - SSH远程控制Linux 1. 下载VS code并准备相关插件 1. VS code官网&#xff1a; 下载地址&#xff1a;https://code.visualstudio.com/Download下载合适版本的vs code。 2. 推荐…

20款奔驰S450升级原厂红外夜视系统,提升您夜晚行车安全

夜视辅助系统增强版不仅可以对处于潜在危险位置的行人进行探测&#xff0c;还可发现动物。当车辆进入没有路灯的区域&#xff0c;第三代夜视系统可自动将仪表盘的显示内容从车速表转变为锐度极高的夜视图像&#xff0c;并将探测到前方出现的行人或动物在系统中以鲜明的色彩突出…

CSS前端:元素的布局技巧

【备注】在线测试网站&#xff0c;点此进入。 一、内边距和外边距 【总结】padding增加本元素和子元素的距离&#xff0c;margin增加本元素和父元素的距离。 二、居中和对齐 【需求】 【HTML】 <div id"container"><p id"top">我在div容器…

打卡第33天------动态规划

周末的时候刷题了,在代码随想录系统的学习了一遍算法,看到leetcode上的题不再那么懵了,有点思路了,心里面对题的恐惧感也在逐渐消失,滴水石穿,小坚持带来大改变。 一、不同路径 leetcode题目链接:62.不同路径 题目描述: 一个机器人位于一个 m x n 网格的左上角 (起始…

【更新2022】省级经济高质量发展指标体系测度 含代码 2000-2022

重磅更新&#xff01;【章汕】制作“省级经济高质量发展指标体系测度 含代码”&#xff0c;市面上有这个版本的数据&#xff0c;但其内容非常不全面&#xff0c;个别指标有误&#xff0c;没有stata和代码&#xff0c;即使有代码小白也很容易报错&#xff1b;没有权重、宽面板等…

大数据SQL面试题002-合并日期重叠的活动

在大数据SQL面试中&#xff0c;我们经常会遇到一些棘手的问题&#xff0c;比如合并日期重叠的活动。本文将为大家详细解析这个问题&#xff0c;并提供相应的解决方案。 一、题目分析 题目要求我们处理一个表&#xff0c;表中记录了每个品牌的活动开始日期和结束日期。如果两个…

鸿蒙(API 12 Beta2版)NDK开发【LLDB高性能调试器】调试和性能分析

概述 LLDB&#xff08;Low Level Debugger&#xff09;是新一代高性能调试器。 当前HarmonyOS中的LLDB工具是在[llvm15.0.4]基础上适配演进出来的工具&#xff0c;是HUAWEI DevEco Studio工具中默认的调试器&#xff0c;支持调试C和C应用。 工具获取 可通过HUAWEI DevEco S…

c语言-EasyX库编写的第一个项目-哪都通快递平台

目录 概要设计与详细设计文档 项目测试 相关文件下载 作为《程序设计微项目设计》进行为期一周的开发 概要设计与详细设计文档 1&#xff0e; 项目名称 “哪都通”快递平台 2.项目概述 2.1项目简介 本项目采用c语言全程编写&#xff0c;运用Easyx库创建窗口进行图形显…

shell函数的基本知识

文章目录 shell函数定义函数调用函数函数参数返回值 Shell 输入/输出重定向输入重定向输出重定向 Shell 函数是 Shell 脚本编程中的一个非常有用的特性&#xff0c;它允许你将一段代码封装起来&#xff0c;给它一个名字&#xff08;函数名&#xff09;&#xff0c;然后在脚本的…

力扣面试经典算法150题:合并两个有序数组

算法 本篇开始&#xff0c;正式进入算法刷题篇。 题目来源于力扣面试经典150题。 题目链接&#xff1a;https://leetcode.cn/studyplan/top-interview-150/ 合并两个有序数组 题目选自150题中的数组/字符串一类&#xff0c;题目难度&#xff1a;简单。 题目描述 给定两个按…

R 语言学习教程,从入门到精通,R 基础运算(5)

1、R 基础运算 本章介绍 R 语言的简单运算。 1.1、赋值 一般语言的赋值是 号&#xff0c;但是 R 语言是数学语言&#xff0c;所以赋值符号与我们数学书上的伪代码很相似&#xff0c;是一个左箭头 <- &#xff1a; a <- 123 b <- 456 print(a b)以上代码执行结果…

分享一个基于Node.js和Vue的农产品销售与交流平台(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

RabbitMQ-安装篇(阿里云主机)

一、操作系统 用的是Alibaba Cloud Linux release 3 (Soaring Falcon)系统&#xff0c;可以通过命令&#xff1a;lsb_release -a 查看系统信息。 二、安装RabbitMQ RabbitMQ 是基于 Erlang 语言构建的&#xff0c;要安装RabbitMQ&#xff0c;需先安装Erlang环境。通过Erlang V…

【IO】使用有名管道实现,一个进程用于给另一个进程发消息,另一个进程收到消息后,展示到终端上,并且将消息保存到文件上一份

目录 1、使用有名管道实现&#xff0c;一个进程用于给另一个进程发消息&#xff0c;另一个进程收到消息后&#xff0c;展示到终端上&#xff0c;并且将消息保存到文件上一份 2、使用有名管道实现两个进程间相互通信 1、使用有名管道实现&#xff0c;一个进程用于给另一个进程发…