数位dp--Windy数

news2024/11/17 4:51:52

题目
在这里插入图片描述
思路
大体思路其实也跟第一篇博客类似,用前缀和的思想处理区间的方案数,然后求方案数则是通过把每一位数都拆分来,然后根据两种选择0-an-1和选an两种情况进行判断,但是因为前导零会对结果产生不一样的结果(比如0013本来是一个可以的方案但是因为0和1不满足条件如果不做特判这种情况会被划掉

那我们就从含有前导零和不含有前导零开始看

含有前导零
如果是含有前导零的情况,那么前n位数一定都是0,那么对于一共有n位数,并且第一位是零的情况,第2位的选择可以为0123456789之中的任意一个,那么我们可以对于所有的前导零的情况,不断的加上方案数,这样就可以直接把含有前导零的情况直接计算出来。

关于方案数的处理

根据上面的情况来看我们发现我们要处理的方案是最高位数是i并且一共有n位数字的方案数,
其实也跟第二篇博客的不降数很像,只不过在选择的限制条件有所不同。对于最高位数是i并且一共有n位数字那么就相当于最高位数是j (abs(j+2)>=2),并且一共有n-1位数的情况之和,这样方程就列出来了,可以直接先预处理所有的方案数啦!

然后是不含有前导零的部分
对于不含有前导零的部分,那么其实就是直接计算就可以了(但是要记得第一位不能为0,这样会产生前导零),记last为前一位选择的数字(初始化的数字为3因为第一位可以选择1到an-1 之间任意的数字,那么就需要构造一个满足条件的last即可) 如果是走左半部分,那么就是从0开始,加上满足条件的方案数:如果是走右半部分,那么就判断一下last和an的绝对值是否大于等于2,如果不满足则不能选择这个数字直接break:对于最后的右子树,如果可以走到,就说明这种方案数是可以满足的,那么直接res++即可。(详细操作直接看代码)

在这里插入图片描述

**代码 **

#include<stdio.h>
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;

const int N=30;
int dp[N][N];

void cal()
{
    for(int i =0;i<=9;i++)dp[1][i]=1;//一共有1位并且上一位是i的方案数量
    
    for(int i =2;i<=N;i++)
        for(int j =0;j<=9;j++)
        {
			for(int k=0;k<=9;k++)
			if(abs(j-k)>=2)
            dp[i][j]+=dp[i-1][k];
        }
}

int DP(int n){
    if(!n)return 0;//0不是正整数
    
    vector<int>cnt;
    while(n)cnt.push_back(n%10),n/=10;
    
    int res=0;
    int last=-3;//上一位的数,因为第一位计算的时候不能包含前导零,那么令last为-3保证所有数都可以满足条件
    //计算包含前导零的情况
    for(int i=cnt.size()-1 ; i >=0  ; i--)
    {
        int x=cnt[i];        
    	for(int j = (i==cnt.size()-1); j<x; ++j)   //第一位从1开始
         if(abs(j-last)>=2) res += dp[i+1][j];//一共有i+1位数字
        
        
        if(abs(last-x)<2)break;//如果当前的数跟上一位的数冲突
        last=x;
  
        if(!i)res++;
    }
    //计算不包含前导零的情况
    for(int i =cnt.size()-1;i>=1;i--)
    for(int j =1;j<=9;j++)
    res+=dp[i][j];

    return res;
}
int main()
{
    int l,r;
    cal();
    cin>>l>>r;
    cout<<DP(r)-DP(l-1)<<endl;
}

ps:是第三篇数位dp的题解,因为和前面的题解的大体思路都很相似,如果看不懂的可以看一下前两篇的题解,有问题也欢迎随时来问!

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

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

相关文章

企业的ICP域名注册,你知道吗?

ICP域名备案查询的api接口&#xff0c;是企业在短时间内获得中沃公司最新数据的API接口。还可以帮助用户快速了解公司信息。基于域名的注册信息实时查询&#xff0c;适合对注册信息变更及时性要求较高的用户。通过ICP信息可以确认企业在互联网中的更多活动轨迹。企业的ICP域名注…

漏洞分析丨cve20110104

作者丨黑蛋目标程序调试工具16进制编辑器XP SP3office 2003ollydbg010Editor三、漏洞验证首先我们配置环境&#xff0c;并下载poc&#xff1a;使用ollydbg附加office excel 2003&#xff1a;打开poc可以看到发生了访问违规异常&#xff0c;像地址0x51453844中写入时发生异常&am…

【专项训练】分治、回溯

分治、回溯其实就是递归,只是是递归的一个细分,是一种特殊的递归 碰到一个题目,你就找他的重复性 最近重复性:根据重复性怎么构造以及如何分解,包括:分治、回溯 最优重复性:动态规划 本质:找重复性、分解问题、组合子问题的结果 回溯:试错! 50. Pow(x, n) https:…

sivalco使用测试pin正向导通

在学完功率半导体器件后&#xff0c;为了能够更好的了解功率半导体器件内部的相关性质&#xff0c;于是利用sivalco软件进行仿真&#xff0c;对于器件工作时相关数据进行分析&#xff0c;对于相关语句进行学习。 在功率半导体中以N或者P半导体进行掺杂获得我们所需要的器件&…

linux重置root用户密码

重置root密码 法一&#xff1a;rd.break 第 1 步&#xff1a;重启系统编辑内核参数 第 2 步&#xff1a;找到 linux 这行&#xff0c;在此行末尾空格后输入rd.break &#xff08;End键也可直接进入行尾&#xff09; 成功后显示页面为&#xff1a; 第 3 步&#xff1a;查看。…

华为HCIE学习之Openstack Cinder组件(cinder对接glusterfs)

文章目录一、MQ的作用二、cinder架构图三、各组件的作用四、cinder对接glusterfs一、MQ的作用 服务内各组件交互通过MQ进行 二、cinder架构图 IET&#xff0c;Linux用软件做存储&#xff0c;CNA识别过去就是IETTGT&#xff0c;物理存储&#xff0c;CNA识别过去就是TGT 三、…

十、FilterListenerAjax案例

1&#xff0c;Filter 1.1 Filter概述 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。Servlet 我们之前都已经学习过了&#xff0c;Filter和Listener 我们今天都会进行学习。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些…

公司的代理怎么用

前一阵子用公司的服务器玩docker的时候&#xff0c;发现拉取不了远程镜像。咨询了一下网络管理员&#xff0c;说是非常时期&#xff0c;外网权限全部关闭。这严重阻碍了我的求知欲望。于是想到了使用代理。这里简单解释一下&#xff0c;很多大型公司为了确保网络安全&#xff0…

2-6 SpringCloud快速开发入门: Eureka 服务注册中心发现与消费服务

接上一章节向Eureka 服务注册中心注册服务&#xff0c;这里讲讲Eureka 服务注册中心发现与消费服务 Eureka 服务注册中心发现与消费服务 我们已经搭建一个服务注册中心&#xff0c;同时也向这个服务注册中心注册了服务&#xff0c;接下来我们就可以发现和消费服务了&#xff0…

图像分割(Unet算法学习笔记)

知识提要 数据集使用VOC2012 CNN 卷积神经网络Convolutional Neural Network GPU图像处理单元Graphic Processing Unit)图形处理器 convolution 卷积 ReLU全名Rectified Linear Unit&#xff0c;意思是修正线性单元 bn全称Batch Normalization批标准化 FC全连接神经网络是一种…

打怪升级之CFile类

CFile类 信息源自官方文档&#xff1a;https://learn.microsoft.com/zh-cn/cpp/mfc/reference/cfile-class?viewmsvc-170。 CFile是Microsoft 基础类文件类的基类。它直接提供非缓冲的二进制磁盘输入/输出设备&#xff0c;并直接地通过派生类支持文本文件和内存文件。CFile与…

第二天作业docker安装

目录 一Docker的简介、下载 二Docker的安装&#xff1a; 2.1 上传安装包&#xff1a;通过xftp直接将包拖拽到Linux里面即可 2.2 安装&#xff1a; 2.3 启动docker 2.4 配置Docker的镜像加速器&#xff1a; 2.5 刷新守护进程: 2.6 重启docker&#xff1a; 2.7 效验配置是否成功 …

三板斧解决leetcode的链表题

在《波奇学单链表》中我们提到单链表的两个特点单向性。头节点尾节点的特殊性导致分类讨论的情况。如何看单链表&#xff1f;让我们简化成下图cur表示当前节点&#xff0c;下图表示cur移动&#xff0c;圆圈表示值用哨兵卫节点(新的头节点)和把尾节点看成NULL来把头尾节点一般化…

spring的beanfactory与applicationContext的区别以及继承关系

applicationContext继承关系 首先可以看一张图 ListableBeanFactory 可列举的bean工厂 hierarchical 分层bean工厂 messageSource 国际化信息 //国际化&#xff08;internationalization&#xff09;是设计和…

1.2 绝对误差、相对误差与有效数字

1.2.1 绝对误差和绝对误差限若x*为准确值x的一个近似值&#xff0c;则称 x-x*为近似值x*的绝对误差&#xff0c;简称误差&#xff0c;并用e*(x)表示&#xff0c;即e*(x)x-x*绝对误差虽然能清楚地表明近似值,与准确值,之间的差异&#xff0c;但是在实际问题中,往往无法知道准确值…

2023年3月全国数据治理工程师认证DAMA-CDGA/CDGP考试怎么通过?

弘博创新是DAMA中国授权的数据治理人才培养基地&#xff0c;贴合市场需求定制教学体系&#xff0c;采用行业资深名师授课&#xff0c;理论与实践案例相结合&#xff0c;快速全面提升个人/企业数据治理专业知识与实践经验&#xff0c;通过考试还能获得数据专业领域证书。 DAMA认…

【ElasticSearch】(一)—— 初识ES

文章目录1. 了解ES1.1 elasticsearch的作用1.2 ELK技术栈1.3 elasticsearch和lucene1.4 为什么不是其他搜索技术&#xff1f;1.5 总结2. 倒排索引2.1 正向索引2.2 倒排索引2.3 正向和倒排3. ES的一些概念3.1 文档和字段3.2 索引和映射3.3 mysql与elasticsearch1. 了解ES Elasti…

TypeScript深度剖析:TypeScript 中高级类型的理解?有哪些?

一、是什么 除了string、number、boolean 这种基础类型外&#xff0c;在 typescript 类型声明中还存在一些高级的类型应用 这些高级类型&#xff0c;是typescript为了保证语言的灵活性&#xff0c;所使用的一些语言特性。这些特性有助于我们应对复杂多变的开发场景 二、有哪…

MQTT协议-发布消息(服务器向客户端发送)

MQTT协议-发布消息&#xff08;服务器向客户端发送&#xff09; 发布消息报文组成&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/129414158 在了解了发布信息的PUBLISH报文后&#xff0c;就可以分析出阿里云服务器向本地客户端发送的报文数据了 实验前…

博客项目

文章目录1. 创建项目2. 数据库设计3. 前置任务3.1 拦截器3.2 统一数据格式3.3 创建一个 Constant3.4 统一异常处理3.5 密码加密4. 功能实现4.1 登录功能4.2 注册功能4.3 博客列表页 &#xff08;功能实现&#xff09;4.3.1 左侧框4.3.2 右侧框 (分页功能 页面显示)4.4 博客详情…