题目链接 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 >= '…
题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输入格式: 包含两个整数,A B. 输出格式: 一个整数 输入输出样例 输入样例#1: 1 10 输出样例#1: 9 输入样例#2: 25 50 输出样例#2: 20 说明 100%的数据,满足 1 <= A <= B <= 2000000000 . 分析: 据大佬说…
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]…
1026: [SCOI2009]windy数 题意:数位DP模板题: 目前只理解了记忆化搜索,就想练练手, ------给递推写法留一个位子 ------ 注意这道题要判断前导0的情况,1 )可以加一个bool lead,或者在(i==0&&pre==-10)特判 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <…
题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分析: 这道题目使用 数位DP 进行求解. 这里有两个条件: 不含前导零: 相邻两个数字之差至少为2. 所以我们需要确定的是,对于当前状态: 他的前一位的数字是啥: 他的前面是不是都是前导0. 我们可以开一个函数 dfs(int pos, int pre, bool all0, bool limit)…
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位前一位为j,然后进行转移就好.主要是需要考虑前导零和前一位是否为极限. 题干: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输入格式: 包含两个整数,A B.…
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #include<cstdio> #include<iostream> #include<cstring> #define R register int using namespace std; ][],num[]; //f[i][j]搜到第i位,前一位是j,且没有上界标记的方案数 i…
题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0$),$f_{i, j} = \sum\limits_{0 \leq k \leq 9, |k - j| > 2} f_{i - 1, k}$ 然后求出$[0, A)$和$[0, B]$分别有多少个$windy$数,相减即可 卡点:无 C++ Code: #include <cstdio>…