当前位置: 首页 > news >正文

洛谷 P2657 [SCOI2009] windy 数 题解 数位dp

[SCOI2009] windy 数

题目背景

windy 定义了一种 windy 数。

题目描述

不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 windy 数。windy 想知道,在 a a a b b b 之间,包括 a a a b b b ,总共有多少个 windy 数?

输入格式

输入只有一行两个整数,分别表示 a a a b b b

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

1 10

样例输出 #1

9

样例 #2

样例输入 #2

25 50

样例输出 #2

20

数据规模与约定

对于全部的测试点,保证 1 ≤ a ≤ b ≤ 2 × 1 0 9 1 \leq a \leq b \leq 2 \times 10^9 1ab2×109

原题

洛谷P2657——传送门

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;const int mod = 2e9 + 6; // 本题无用,仅是因为懒得删()int dp[20][20], a[20];                             // dp记录[pos][pre_num]状态下的满足条件的个数,a[]记录数字串
int dfs(int pos, int pre_num, bool bound, bool st) // pos为此时的位置,pre_num为上一位的数字,bound表示前面每一位是否都是上界,st表示是否前面全是0
{if (pos == 0) // 枚举完每一位时返回return 1;if (!bound && dp[pos][pre_num] != -1) // 不是位于上界,就可以利用前面dfs已经求出的答案(!=-1表示前面已经求出该答案)return dp[pos][pre_num];int max_num; // 可枚举的该位的数的上界if (bound)max_num = a[pos];elsemax_num = 9;int res = 0; // 统计此时的答案for (int i = 0; i <= max_num; i++){if (abs(i - pre_num) >= 2){if (st && i == 0) // 如果前面全是0并且该位也是0,那么pre_num依旧设置为-6,表示后面接任意数字都不受“相邻两个数字之差至少为2”这个限制res = (res + dfs(pos - 1, -6, bound && (i == a[pos]), 1)) % mod;elseres = (res + dfs(pos - 1, i, bound && (i == a[pos]), 0)) % mod;}}if (!bound && !st) // 没在边界时,记录下该状态对应的答案dp[pos][pre_num] = res;return res;
}
int solve(int x)
{memset(dp, -1, sizeof(dp)); // 将dp数组初始化为-1,表示对应状态的答案目前还未计算出int len = 0;                // 数字长度while (x){a[++len] = x % 10;x /= 10;}return dfs(len, -6, 1, 1); // pre_num设置为-6,表示后面接任意数字都不受“相邻两个数字之差至少为2”这个限制
}
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int a, b;cin >> a >> b;cout << solve(b) - solve(a - 1); // ans[a,b]即为ans[0,b]-ans[0,a-1]return 0;
}
http://www.lryc.cn/news/348463.html

相关文章:

  • Python爬虫入门:网络世界的宝藏猎人
  • 【NodeMCU实时天气时钟温湿度项目 6】解析天气信息JSON数据并显示在 TFT 屏幕上(心知天气版)
  • 重构四要素:目的、对象、时机和方法
  • 基于Echarts的大数据可视化模板:服务器运营监控
  • Python3 笔记:Python的常量
  • 【Linux】自动化构建工具make/Makefile和git介绍
  • C语言—关于字符串(编程实现部分函数功能)
  • picoCTF-Web Exploitation-Trickster
  • SSH 免密登录,设置好仍然需要密码登录解决方法
  • 【斑马打印机】web前端页面通过BrowserPrint API连接斑马打印机进行RFID条形码贴纸打印
  • DigitalOcean 应用托管更新:应用端到端运行时性能大幅改进
  • c/c++对于char*的理解(联合string容器)
  • Web前端三大主流框架是什么?
  • 一个基于servlet的MVC项目-登录验证
  • Windows 11 下 kafka 的安装踩坑
  • 二维数组:行列互换/求最大值及其所在位置/求各行各列的和/矩阵乘积/深入理解二维数组
  • The Onion Router-洋葱
  • 自动化工具 Ansible:playbooks 剧本编写
  • AttributeError: module ‘flask.app‘ has no attribute ‘route‘
  • 在云计算与人工智能中,7ECloud扮演着什么样的角色
  • 视频推拉流EasyDSS视频直播点播平台如何优先展示正在直播的直播间?
  • JavaEE之线程(4)——线程安全、线程安全的原因,synchronized关键字
  • Python3 笔记:分支结构
  • 《TAM》论文笔记(上)
  • 【Java的抽象类和接口】
  • 今天开发了一款软件,我竟然只用敲了一个字母(文末揭晓)
  • 【C++杂货铺】红黑树
  • css--控制滚动条的显示位置
  • 华为设备display查看命令
  • 自动攻丝机进出料激光检测 进料出料失败报警循环手动及关闭报警退出无限循环