一道比较基础的数位DP,还是挺套路的。

首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式:

\(f[a,b]=f(b)-f(a-1)\)

然后考虑如何求解\(f(x)\)。我们首先可以在不考虑数的大小的情况下得出长为\(i\)位且以数字\(j\)开头的windy数字个数。

这个还是很好求的,我们设\(f_{i,j}\),然后每一位从上一位转移即可。

然后考虑如何统计,我们把要统计的数分成三类:

  1. 位数比原来的数小的,且开头不能为\(0\)的数的总数。这个直接累加即可。
  2. 位数和原来的数一样,但开头的数字比原来的数字小的数的总数。由于这样后面也可以随便取,因此累加即可。
  3. 位数和原来的数一样,且开头的数字也一样的数的总数。这个就比较难求了。我们考虑枚举后面的每一位,在不填到最高位的情况下都可以继续累加。然后我们假定这一位也到达了最高位,然后继续统计即可。

注意在统计第三种数时要注意若此时相邻的两个数的最高位只差小于\(2\)需要直接退出

最后我们发现这个只能统计所以小于\(x\)的windy数。因此我们把原来的起手式变成\(f(b+1)-f(a)\)即可。

CODE

#include<cstdio>
#include<cstring>
using namespace std;
int a,b,bit[15],cnt;
long long f[15][10];
inline int abs(int x)
{
return x>0?x:-x;
}
inline void init(void)
{
register int i,j,k;
for (i=0;i<=9;++i)
f[1][i]=1;
for (i=2;i<=10;++i)
for (j=0;j<=9;++j)
for (k=0;k<=9;++k)
if (abs(j-k)>=2) f[i][j]+=f[i-1][k];
}
inline void solve(int x)
{
while (x) bit[++cnt]=x%10,x/=10;
}
inline long long get(int x)
{
register int i,j,k,w; long long ans=0;
cnt=0; solve(x);
for (i=1;i<cnt;++i)
for (j=1;j<=9;++j)
ans+=f[i][j];
for (i=1;i<bit[cnt];++i)
ans+=f[cnt][i];
for (i=cnt-1;i>=1;--i)
{
for (j=0;j<bit[i];++j)
if (abs(j-bit[i+1])>=2) ans+=f[i][j];
if (abs(bit[i]-bit[i+1])<2) break;
}
return ans;
}
int main()
{
scanf("%d%d",&a,&b); init();
printf("%lld",get(b+1)-get(a));
return 0;
}

Luogu P2657 [SCOI2009]windy数的更多相关文章

  1. luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索

    题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...

  2. 题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP

    BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...

  3. P2657 [SCOI2009]windy数

    P2657 [SCOI2009]windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B ...

  4. 洛谷 P2657 [SCOI2009]windy数 解题报告

    P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{wi ...

  5. 洛谷——P2657 [SCOI2009]windy数

    P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和 ...

  6. C++ 洛谷 P2657 [SCOI2009]windy数 题解

    P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...

  7. 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]

    题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...

  8. [洛谷P2657][SCOI2009]windy数

    题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...

  9. P2657 [SCOI2009]windy数 数位dp

    数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...

随机推荐

  1. vue-cli在控制台创建vue项目时乱码的问题

    新装的win10系统,使用vue-cli在控制台创建项目时出现乱码,请问如何处理? 解决: 打开cmd,在控制台输入CHCP 65001,按回车键即可将编码格式设成utf-8,再创建就不会乱码了. 执 ...

  2. JDK动态代理源码解析

    动态代理.静态代理优缺点     关于JDK的动态代理,最为人熟知的可能要数Spring AOP的实现,默认情况下,Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的 ...

  3. linuxserver本地和百度云备份脚本小试

    本地单文件上传脚本.命名uf 这是在本机上做的測试,利用bpcs_uploader脚本实现,仅仅是进行简单的封装.自己主动完好云端文件路径. 技术要点:使用dirname获取文件所在文件夹.使用pwd ...

  4. openssl交叉编译记录

    本次任务是要完毕嵌入式Linux下对openssl程序的支持.     我的开发环境:ARM9开发板 和 嵌入式Linux操作系统.装有Linux系统(我的是ubuntu9.04)的PC机一台.串口和 ...

  5. [NOI2003],[AHOI2006]文本编辑器

    嘟嘟嘟 [NOI2003]的其实就是一个板子--所以我就不说啥了. 唯一需要注意的是读入字符(哎--):题中说"中间可能有空格,请忽略"的意思是要在程序里特判掉,不是不管他-- 输 ...

  6. ROS教程1 消息查看和使用服务

    消息动态图 rqt_graph能够创建一个显示当前系统运行情况的动态图形. rosrun rqt_graph rqt_graph 如果你将鼠标放在/turtle1/command_velocity上方 ...

  7. STM8

    STM8L101F3P6查询发送中断接收 http://blog.csdn.net/sy_lixiang/article/details/34076317 STM8L103F3P6,内部时钟,16MH ...

  8. M100 (0)开发

    [SDCC 2015现场]大疆Paul Yang:多旋翼飞行器的未来就是机器人的未来 http://www.csdn.net/article/2015-11-19/2826268 开发官网 https ...

  9. 20145203盖泽双 《网络对抗技术》实践九:Web安全基础实践

    20145203盖泽双 <网络对抗技术>实践九:Web安全基础实践 1.实践目标 1.理解常用网络攻击技术的基本原理. 2.Webgoat下进行相关实验:SQL注入攻击.XSS攻击.CSR ...

  10. c# 根据当前时间获取,本周,本月,本季度,月初,月末,各个时间段

    DateTime dt = DateTime.Now;  //当前时间   DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") //24小时制 ...