Luogu P2657 [SCOI2009]windy数
一道比较基础的数位DP,还是挺套路的。
首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式:
\(f[a,b]=f(b)-f(a-1)\)
然后考虑如何求解\(f(x)\)。我们首先可以在不考虑数的大小的情况下得出长为\(i\)位且以数字\(j\)开头的windy数字个数。
这个还是很好求的,我们设\(f_{i,j}\),然后每一位从上一位转移即可。
然后考虑如何统计,我们把要统计的数分成三类:
- 位数比原来的数小的,且开头不能为\(0\)的数的总数。这个直接累加即可。
- 位数和原来的数一样,但开头的数字比原来的数字小的数的总数。由于这样后面也可以随便取,因此累加即可。
- 位数和原来的数一样,且开头的数字也一样的数的总数。这个就比较难求了。我们考虑枚举后面的每一位,在不填到最高位的情况下都可以继续累加。然后我们假定这一位也到达了最高位,然后继续统计即可。
注意在统计第三种数时要注意若此时相邻的两个数的最高位只差小于\(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数的更多相关文章
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- 题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...
- P2657 [SCOI2009]windy数
P2657 [SCOI2009]windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B ...
- 洛谷 P2657 [SCOI2009]windy数 解题报告
P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{wi ...
- 洛谷——P2657 [SCOI2009]windy数
P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和 ...
- C++ 洛谷 P2657 [SCOI2009]windy数 题解
P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...
- 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...
- [洛谷P2657][SCOI2009]windy数
题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
随机推荐
- Linux 学习笔记之超详细基础linux命令 Part 4
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 3----------------- ...
- 《ASP.NET MVC企业实战》(三)MVC开发前奏
在上一篇“<ASP.NET MVC企业级实战>(二)MVC开发前奏”中跟随作者大概了解了一些C#3.0和3.5中的新特性.本篇继续以这样的方式来学习C#中的一些特性. 一.C#3. ...
- 一. Redis 常用命令
键值相关命令 1. KETS 查询所有的key 127.0.0.1:6379> keys * 1) "tony"2) "hexu1"3) "he ...
- (网页)the server responded with a status of 403 (Forbidden)
403跨域问题.看一下要访问的url.
- 记录C/C++中遇到的一些小问题
1. printf 比如 char a = \x90; printf("%02x", a); 想输出为90,没想到却是ffffff90,这个问题害我一个程序老是出错 最终发现只要改 ...
- React Refs
React Refs React 支持一种非常特殊的属性 Ref ,你可以用来绑定到 render() 输出的任何组件上. 这个特殊的属性允许你引用 render() 返回的相应的支撑实例( back ...
- maven(七),本地仓库
运行机制: 在pom.xml文件中添加依赖jar包时,首先会从本地仓库查找,如果本地仓库不存在,就从中央仓库下载到本地仓库,中央仓库是maven默认的远程仓库 仓库坐标 eclipse默认会在wind ...
- [20171128]rman Input or output Memory Buffers.txt
[20171128]rman Input or output Memory Buffers.txt --//做一个简单测试rman 的Input or output Memory Buffers. 1 ...
- [20170825]不启动监听远程能连接数据库吗2.txt
[20170825]不启动监听远程能连接数据库吗2.txt --//曾经写过一篇不启动监听连接数据库的帖子:http://blog.itpub.net/267265/viewspace-1816211 ...
- python第七十一天---堡垒机
堡垒机的表结构图: