[SCOI2009] windy 数 (数位dp)
题目
算法
应该是一道很经典的数位dp题
我们设dp[i][j]是填到第i位此时第i位的数是j的方案数
然后进行转移(代码注释)
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
ll p,q,dp[15][15];
ll init(){//进行初始化
for(ll i = 0;i <= 9;i++) dp[1][i] = 1;//[0,9]显然都是windy数
for(ll i = 2;i <= 10;i++)
for(ll j = 0;j <= 9;j++)
for(ll k = 0;k <= 9;k++)
if(abs(j - k) >= 2) dp[i][j] += dp[i - 1][k];//先预处理好dp值
}
ll work(ll x){//统计答案
ll a[15],len = 0,ans = 0;
while(x){//将x分解
a[++len] = x % 10;
x /= 10;
}
for(ll i = 1;i <= len - 1;i++)//先统计位数不足x位数的数 那这些数明显都可以计算到方案中
for(ll j = 1;j <= 9;j++)
ans += dp[i][j];
for(ll i = 1;i < a[len];i++)//位数和x位数相同 但最高位比x最高位小 显然也可以
ans += dp[len][i];
for(ll i = len - 1;i >= 1;i--){//这里处理位数和x位数相同 最高位 = x最高位的情况
for(ll j = 0;j <= a[i] - 1;j++)
if(abs(j - a[i + 1])>= 2) ans += dp[i][j];
if(abs(a[i + 1] - a[i]) < 2) break;
}
return ans;
}
ll a,b;
int main(){
scanf("%lld%lld",&a,&b);
init();
cout<<work(b + 1) - work(a);//这里应用前缀和的思想 work计算[0,x)的方案数 那么用work(b + 1) - work(a) 就是[a,b]的方案数
}
[SCOI2009] windy 数 (数位dp)的更多相关文章
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- BZOJ1026: [SCOI2009]windy数[数位DP]
1026: [SCOI2009]windy数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6346 Solved: 2831[Submit][Sta ...
- 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...
- 【bzoj1026】[SCOI2009]windy数 数位dp
题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入 包含两个整数 ...
- [bzoj1026][SCOI2009]windy数——数位dp
题目 求[a,b]中的windy数个数. windy数指的是任意相邻两个数位上的数至少相差2的数,比如135是,134不是. 题解 感觉这个题比刚才做的那个简单多了...这个才真的应该是数位dp入门题 ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
- bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...
- bzoj 1026: [SCOI2009]windy数 & 数位DP算法笔记
数位DP入门题之一 也是我所做的第一道数位DP题目 (其实很久以前就遇到过 感觉实现太难没写) 数位DP题目貌似多半是问从L到R内有多少个数满足某些限制条件 只要出题人不刻意去卡多一个$log$什么的 ...
- $SCOI2009\ windy$数 数位$dp$
\(Sol\) 数位\(dp\)常规套路题. \(dp[i][j]\)表示从低位到高位填到第\(i\)位且第\(i\)位的数字为\(j\)的方案数.答案就是\(sol(r)-sol(l+1).\)这里 ...
随机推荐
- 打造专属测试平台4-使用Docker部署Django项目
编写完项目代码后,为了稳定的运行,需要将其部署至服务器.这里我选择了Docker去部署Django后端代码. 首先来看看Runoob对Docker的介绍: Docker 是一个开源的应用容器引擎,基于 ...
- 在Windows上使用Docker 创建MongoDB 副本集的极简方法(翻译)
这篇博客介绍下在Windows上使用Docker 创建MongoDB 三节点副本集的最简单的方法.以下命令需要Docker for Windows并使用Linux 容器. 1: 为每个节点创建数据卷 ...
- HTML中的emment
emment的优点和使用方法: 优点:Emment是前端开发者必备的工具,使用它可以大大提高前端开发效率. 使用方法:Emment的使用方法非常简单,直接在编辑器上输入HTML和CSS代码的缩写,然后 ...
- 通过简单例子 | 快速理清 UML 中类与类的六大关系
关于封面:我想我们都会离开 类与类之间的六大关系 泛化 ( Generalization ) ---> 表继承关系 实现 ( Realization ) 关联 ( Association ) 聚 ...
- 第2次 Beta Scrum Meeting
本次会议为Beta阶段第2次Scrum Meeting会议 会议概要 会议时间:2021年5月31日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:对完成工作进行阶段性汇报:对下 ...
- Noip模拟49 2021.9.7
T1 reverse 又一道板子打假的挂分题,直接挂到倒二.. 考场上思路神奇,居然想到用$bfs$建边然后跑最短路, 其实当时也想到了直接$bfs$,但是不知道为啥觉得$dij$屌就没直接打$bfs ...
- 洛谷 P3147 [USACO16OPEN]262144 P
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...
- Luogu P2827 [NOIp2016提高组]蚯蚓 | 神奇的队列
题目链接 80分思路: 弄一个优先队列,不停地模拟,切蚯蚓时就将最长的那一条出队,然后一分为二入队,简单模拟即可.还要弄一个标记,表示从开始到当前时间每一条蚯蚓应该加上的长度,操作时就加上,入队时就减 ...
- google-chrome 启动报错 nss_util.cc(627)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required
一.错误情况 报错如下: [0807/144244.712736:FATAL:nss_util.cc(627)] NSS_VersionCheck("3.26") failed. ...
- SpringBoot之MultipartFile文件上传(6)
1.静态文件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...