AcWing 1083. Windy数(数位DP)

news2025/1/16 8:09:41

AcWing 1083. Windy数(数位DP)

  • 一、问题
  • 二、分析
    • 状态表示
    • 状态转移
    • 初末状态
    • 循环设计
    • 注意事项
  • 三、代码

一、问题

在这里插入图片描述

二、分析

这道题考察的是数位DP的知识,对于数位DP的分析方法作者在之前的文章中做过详细地介绍:AcWing 1081. 度的数量(数位DP)和AcWing 1082. 数字游戏(数位DP)。

如果对数位DP的做题方法不了解的话,可以去看一看作者之前写的这两篇文章。

对于这道题的分析方法也是一样的,我们同样是对区间上限值X的每一位进行分析。

而对于每一位而言,我们要将其分为两类。

假设上限值在该位的值是 x x x,那么我们主要分为两类:一类是该位填写小于x的数,这样做的好处就是无论后面的位怎么填,这个数都是小于上限值的,我们无需考虑超过上限的问题。

整体的分类逻辑可以画成下面的图:
在这里插入图片描述
然后我们从高位开始分类讨论。

在这里插入图片描述
我们可以发现越往下分类,我们的数字的固定前缀就会越长。留给我们随机填的位越少。

但是我们会发现,所有分支的左侧的数不管怎么写都比上限小,所以我们不需要考虑大小,只需要考虑哪些数字符合题目条件。

那么如何去计算符合题目条件的数字个数呢?

我们拿出其中一个分类作为例子:
在这里插入图片描述那么这个DP怎么写呢?

状态表示

f [ i ] [ j ] f[i][j] f[i][j]表示当前位是 i i i,算上当前位,该数字共有 j j j位时, w i n d y windy windy数的个数。

状态转移

根据题目内容的表述, w i n d y windy windy数是值相邻两位的差的绝对值是大于等于2的。那么我们可以去枚举 i i i位的左边一位 x x x,这个 x x x i i i的差值必须是大于等于2的,那么状态转移方程可以写成:
f [ i ] [ j ] = ∑ f [ x ] [ j − 1 ] f[i][j]=\sum_{} f[x][j-1] f[i][j]=f[x][j1]
其中: ∣ x − i ∣ ≥ 2 |x-i| \geq 2 xi2

初末状态

如果一个数只有个位那么它也是 w i n d y windy windy数,所以我们让所有的 f [ i ] [ 1 ] f[i][1] f[i][1]初始化为1。

循环设计

三重循环即可,前两重循环是枚举 i i i j j j。第三重循环就是枚举刚刚提到的 x x x

注意事项

这道题中提到了一个很特别的条件,不能包含前导零,什么意思呢?

我们首先要弄明白什么是前导零,000123中1前面的0就是前导零。

因此这道题中我们的最高位不能从0开始枚举,只能从1开始枚举。

这样做有什么影响呢?

首先,假设上限值x有6位。由于我们最高位不是0,这就说明我们最终枚举的答案都是6位的。但是小于6位的也在范围里,所以就出现了漏解的情况。

那就有人可能会想,那我第一位就从0开始枚举。

这样做的话依旧会导致漏解,你从0开始枚举,就说明你想要5位的答案。那么如果一个答案是5位的,我们从高位到低位开始考虑,它的最高位可以是1到9的任何数字。

但是如果你用第6位写0来枚举5位的答案,那么你的第5位是不能写1的。因为1和0的差的绝对值小于2。

也就是说 f [ 0 ] [ i ] f[0][i] f[0][i]不等于 f [ x ] [ i − 1 ] f[x][i-1] f[x][i1]

因此,对于低位的情况我们不能通过增加前导零的方式去枚举。

怎么办呢?

我们可以通过刚刚分类讨论的方式算出所有6位的答案。

由于少于6位的数字一定是小于上限值的,所以我们让j只需要从1到5开始枚举,j表示长度,再让i表示高位写的数字(从1到9),给我们的答案加上所有的f[i][j]即可。

三、代码

#include<bits/stdc++.h>
using namespace std;
const int N = 40;
int f[N][N];

void init()
{
	for(int i = 0; i <= 9; i ++ )f[1][i] = 1;

	for(int i = 2; i < N; i ++ )
	{
		for(int j = 0; j <= 9; j ++ )
		{
			for(int k = 0; k <= 9; k ++ )
			{
				int dis = abs(j - k);
				if(dis >= 2)
				{
					f[i][j] += f[i - 1][k];
				}
			}
		}
	}
}
int dp(int x)
{
	if(!x)return 0;
	vector<int>v;
	int last = -2;
	int res = 0;
	while(x)
	{
		v.push_back(x % 10);
		x /= 10;
	}
	for(int i = v.size() - 1; i >= 0; i -- )
	{
		int a = v[i];
		for(int j = (i == v.size() - 1); j < a; j ++ )
		{
			int dis = abs(last - j);
			if(dis >= 2)
				res += f[i + 1][j];
		}
		if(abs(last - a) >= 2)last = a;
		else break;
		if(!i)res++;
	}
	for(int i = 1; i < v.size(); i ++ )
		for(int j = 1; j <= 9; j++)
			res += f[i][j];
	return res;
}
int main()
{
	init();
	int a ,b;
	cin >> a >> b;
	cout << dp(b) - dp(a - 1) << endl;
	return 0;
}

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

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

相关文章

java面试题(九)集合篇

2.1 Java中有哪些容器&#xff08;集合类&#xff09;&#xff1f; 参考答案 Java中的集合类主要由Collection和Map这两个接口派生而出&#xff0c;其中Collection接口又派生出三个子接口&#xff0c;分别是Set、List、Queue。所有的Java集合类&#xff0c;都是Set、List、Qu…

【LeetCode】Day206-二叉树着色游戏

题目 1145. 二叉树着色游戏【中等】 题解 官解说的实在是抽象了&#xff0c;看了下高赞题解&#xff0c;果然很清晰易懂 以 x 为根&#xff0c;它的三个邻居&#xff08;左儿子、右儿子和父节点&#xff09;就对应着三棵子树&#xff1a; 左子树右子树父节点子树 哪棵子树…

微服务项目框架及多模块开发

目录 项目模式 技术栈 项目架构图 模块 案例演示 主模块 zmall-common子模块 zmall-user子模块 项目模式 电商模式&#xff1a;市面上有5种常见的电商模式&#xff0c;B2B、B2C、 C2B、 C2C、O2O; 1、B2B模式 B2B (Business to Business)&#xff0c;是指 商家与商家…

java递归-八皇后问题(回溯算法)

1.八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都…

Day04-数据分析模型

文章目录数据分析模型数据分析流程第一&#xff1a;定性法第二&#xff1a;定量法一、数据分析要解决什么问题&#xff1f;1. 研究历史2. 解释现状4. 洞察商机5. 寻求最佳方案二、数据分析师的工作三、数据分析流程1. 数据分析框架2. 数据获取3. 数据处理4. 数据分析5. 撰写报告…

大数据技术架构(组件)18——Hive:FileFormats(1)

1.5、FileFormats1.5.1、FileFormat对比&#xff1a;1.5.1.1、Text File每一行都是一条记录&#xff0c;每行都以换行符&#xff08;\ n&#xff09;结尾。数据不做压缩&#xff0c;磁盘开销大&#xff0c;数据解析开销大。可结合Gzip、Bzip2使用&#xff08;系统自动检查&…

Python 3 基本数据类型,包含示例演示(初学友好)

嗨害大家好鸭~ 我是小熊猫 有好好学习python吗&#xff1f; Python学习资料电子书 点击此处跳转文末名片获取 Python3 基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值&#xff0c;变量赋值以后该变量才会被创建。 在 Python 中&#xff0c;变量就是变量…

Redis实现分布式锁

基于Redis实现分布式锁。分为单Redis节点实现和Redis集群实现。 基于单个Redis节点实现分布式锁 作为分布式锁实现过程中的共享存储系统&#xff0c;Redis可以使用键值对来保护锁变量&#xff0c;在接收和处理不同客户端发送的加锁的操作请求。 客户端A、C同时请求加锁&#…

【Linux】基本开发工具的使用-yumvimgcc/g++git

文章目录Linux 软件包管理器-yum什么是软件包window和Linux互传文件的工具: lrzszyum注意事项查看软件包注意事项如何安装软件注意事项如何卸载软件好玩的指令sl 小火车cowsay 打印一只说话的小牛boxes 打印一个ASCII的动画linux_logo 显示linux系统的logocurl http://wttr.in …

2021美赛D题艺术家思路整理

问题整理 使用influence_data数据集或其部分创建音乐影响力的&#xff08;多个&#xff09;定向网络&#xff0c;其中影响者与关注者相连。开发捕捉此网络中“音乐影响的参数”。通过创建定向影响网络的子网络来探索音乐影响力的子集。描述这个子网络。你的“音乐影响”指标在…

((蓝桥杯 刷题全集)【备战(蓝桥杯)算法竞赛-第3天】( 从头开始重新做题,记录备战竞赛路上的每一道题 )距离蓝桥杯还有64天

&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6;&#x1f3c6; 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&a…

PMP知识点1

根据PMBOK和参考书籍自己总结的一些不熟悉知识点&#xff0c;当做笔记放这复习。 1. 项目战略管理、组合管理、项目及管理、项目管理区别 战略管理项目组合管理项目集管理项目管理工作内容明确组织战略目标选择有利于实现战略目标的项目分析并利用各项目之间有机联系规范有序…

RAS《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》

Read abstract and personal Summary of《Research on Offense and Defense of DDos Based on Evolutionar Game Theory》Ⅰ&#xff1a;Read abstract(阅读摘要)0&#xff1a;Proper noun interpretation&#xff08;专有名词解释&#xff09;1&#xff1a;The question raise…

windows 休眠后风扇狂转的解决方法

windows 休眠后风扇狂转的解决方法 问题描述&#xff1a; 在Windows电脑接入usb设备后进入休眠状态时&#xff0c;风扇立刻最大功率运行&#xff0c;在拔出usb/唤醒电脑后风扇会恢复正常。 解决方法&#xff1a; 使用powercfg 查询唤醒电脑的设备&#xff0c;然后移除此设备…

C语言基础(五)—— 数组、数组地址(步长+1)、字符串输入输出、随机数

1. 概述在程序设计中&#xff0c;为了方便处理数据把具有相同类型的若干变量按有序形式组织起来——称为数组。数组就是在内存中连续的相同类型的变量空间。同一个数组所有的成员都是相同的数据类型&#xff0c;同时所有的成员在内存中的地址是连续的。数组属于构造数据类型&am…

从Manifold到SNE再到t-SNE再回到Manifold

在介绍t-SNE之前&#xff0c;要从流形开始讲起。 流形Manifold 将流形引入到机器学习领域主要有两个用途&#xff1a; 改进原本欧式空间中的算法&#xff0c;使它能作用到流形上&#xff0c;直接或者间接地利用和流行的性质和构造。将流形映射到欧式空间中&#xff0c;令欧式…

软件测试面试:年后就拿到了5个offer,希望也能助你拿下满意的offer

求职&#xff0c;就像打仗&#xff0c;不仅是一场挑战自己的战斗&#xff0c;也是一场与用人单位的较量。 而求职者只有准备足够充分&#xff0c;才能在这场毫无硝烟的“战场”上取得胜利。 那么软件测试面试需要做哪些准备以及软件测试面试需要哪些技巧呢&#xff1f; 1、熟…

ThreadLocal 适合用在哪些实际生产的场景中?

在通常的业务开发中&#xff0c;ThreadLocal有两种典型的使用场景 场景1&#xff0c;ThreadLocal 用作保存每个线程独享的对象&#xff0c;为每个线程都创建一个副本&#xff0c;这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本&#xff0c;确保线程安全 …

【内网安全-隧道搭建】内网穿透_Frp上线、测试

目录 Frp&#xff08;简易上线&#xff09; 1、简述&#xff1a; 2、工具&#xff1a; 3、使用&#xff1a; 1、准备&#xff1a; 2、服务端&#xff08;公网&#xff09;&#xff1a; 2、客户端&#xff08;内网&#xff09;&#xff1a; 3、测试方法&#xff1a; 4、…

【Linux】基础IO --- 软硬链接、acm时间、动静态库制作、动静态链接、动静态库加载原理…

我用执着烧死了所有的幼稚和任性&#xff0c;那片荒野慢慢长出了理智冷漠和清醒。 文章目录一、软硬链接1.软硬链接的区别&#xff08;是否具有独立的inode&#xff09;2.软硬链接的作用2.1 软链接作用&#xff08;建立快捷方式&#xff09;2.2 硬链接作用&#xff08;防止误删…