洛谷P2657 Loj10165 SCOI2009 windy数】的更多相关文章

题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输入格式: 包含两个整数,A B. 输出格式: 一个整数 数位DP,记录每一位最后一位是什么,枚举时如果他们的差小于2就return. 但是注意!如果有前导零,也就是00014是一个合法的序列,但是一般会判断1和0差小于2,就算非法了. 我们需要记录前导零,如果当前是前导零,则默认当前位位-10000…
最近学习了一下数位DP 感觉记忆化搜索是比较好理解的 这篇博客对我有一定的启发https://www.cnblogs.com/zbtrs/p/6106783.html 总结了一下:    用数位DP的题目:    形如“问在x到y的整数中满足性质……的数的个数”   套路: main函数一般是这样的     设max为上限值,即我们要统计 max之前的满足性质的数的个数 为了使搜到的数都满足 x<max  所以我们在搜索时定义一个bool型变量shangxian,表示搜到当前数位时前面的数位是否…
感觉数位DP有点弱,强化一下... 这道题是一道比较裸的数位DP. 我们用\(dp[i][j]\)表示长度为\(i\)最高位为\(j\)的windy数有多少个,状态转移方程为\(dp[i][j]=\sum_{abs(j-k)>=2}{dp[i-1][k]}\). 然后有一个小优化(其实不能算优化吧),就是算一下输入两个数的长度,然后取长度最大值作为第一维的极限,这样就稍微比直接算到\(i=11\)要优一点了. AC代码如下: 28ms 788kb // By Ilverene #include<…
Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为 \(2\) 的正整数被称为windy数. windy想知道, 在 \(A\) 和 \(B\) 之间,包括 \(A\) 和 \(B\),总共有多少个windy数? Limitation \(1 \leq A \leq B \leq 2000000000\) Solution 前天重写这个题,换了一种比较好写的DP方式,这里记下来. 考虑由于前导 \(0\) 和顶上界都最多可能有 \(1\) 中方案,因此直…
数位 dp. // 数位 dp 其实是爆搜加记忆化 #include<iostream> #include<cstring> #include<cmath> using namespace std; const int N=15; //数据范围是 10^n 就可以开 n 那么大的数组. int dp[N][2][2][N],a[N]; //dp 数组用来记忆化,a 数组用来数位分离 int dfs(int loc,bool limit,bool lead,int pre…
P2657 [SCOI2009]windy数 题目描述 \(\tt{windy}\)定义了一种\(\tt{windy}\)数.不含前导零且相邻两个数字之差至少为\(2\)的正整数被称为\(\tt{windy}\)数. \(\tt{windy}\)想知道, 在\(A\)和\(B\)之间,包括\(A\)和\(B\),总共有多少个\(\tt{windy}\)数? 输入输出格式 输入格式: 包含两个整数,\(A\) \(B\). 输出格式: 一个整数 说明 \(100\%\)的数据,满足 \(1 \le…
P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 思路: 其实挺简单的,算是数位DP入门级别的题吧,特别要注意限制,如果没有前导0和没有最高位限制就不能返回,反之答案是错误的,(原来前导0也很重要!) 设dp[pos][j]表示第pos位上一位是j的方案数,然后记搜即可. 记忆化搜索: #include<bits/s…
P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算了,复制一遍吧<<((因为当前的Cal(k)是计算出从1到k-1的符合条件的数的个数,所以要计算a~b的个数要用Cal(b+1)-Cal(a).))>>) f[i][j]定义一样,以j开始的且符合条件的总位数为i的答案个数.(好绕啊) 预处理转移不用讲吧:f[i][j]+=f[i-1]…
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9') c = getchar(); while(c <= '9' && c >= '…
P2657 [SCOI2009]windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? Solution 有先导 \(0\) 的数位\(dp\) 把此位前有无前导 \(0\) 作为搜索的一个状态即可 注意有前导 \(0\) 时不能直接返回, 因为有前导 \(0\) 就代表着无法到达 \(10^{len} - 1\) Code #include<iostre…