一道比较基础的数位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. Java JVM监控工具JConsole简介

    Java JVM监控工具JConsole简介 jconsole命令 功能:打开java监视管理控制台 方法: jconsole [选项1] [选项2] …… [选项n] 常用选项: -help     ...

  2. python第十八天

    学习内容: json 模块,pickle模块,shelve模块,xml模块 json 模块  序列化: import json,pickle info={ 'name':'a', 'age':34, ...

  3. 将mssql数据库高版本迁移到低版本

    将mssql数据库高版本迁移到低版本 在低版本目标数据库中创建目标空数据库[TargetDb] ,注意新建数据库即可,不要创建任何表 在低版本数据库中,选中[服务器对象=>链接服务器] 右键[新 ...

  4. nginx server_name匹配顺序

    server_name可为IP/domain/localhost/null等任何字符串(字符串server_name也可以用来匹配),注意各个 server 块的顺序. 1.如果只有一个server, ...

  5. linux系统日志自动切割工具----logrotate

    参考资料 :https://www.cnblogs.com/kevingrace/p/6307298.html 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务 ...

  6. ccf题库中2016年4月2日俄罗斯方块问题

    题目如下: 问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新 ...

  7. Python3编写网络爬虫09-数据存储方式二-JSON文件存储

    2.JSON文件存储 全称为JavaScript Object Notation 通过对象和数组的组合来表示数据,构造简洁且结构化程度非常高.是一种轻量级的数据交换格式 2.1 对象和数组 在Java ...

  8. UG/NX 8.0安装方法(图文详解)

    UG8.0,自从被西门子收购后改名为NX,也称NX8.0,作为一款非常优秀三维模具设计软件.他可以针对用户的虚拟产品设计和工艺设计的需求,提供经过实践验证的解决方案.其以全面的设计概念.良好的界面受到 ...

  9. Swift开发实例:苹果Swift编程语言新手教程中文版+FlappyBird,2048游戏源代码

    源代码: 用IOS Swift语言实现的Flappy Bird源代码:http://download.csdn.net/detail/estellise/7449547 用IOS Swift实现的游戏 ...

  10. UVA127-"Accordian" Patience(模拟)

    Problem UVA127-"Accordian" Patience Accept:3260  Submit:16060 Time Limit: 3000 mSec Proble ...