「 Luogu P2657 」 windy数
# 题目大意
给出区间 $[a,b]$,求出区间中有多少数满足下列两个条件
- 不含有前导 $0$。
- 相邻两个数字之差的绝对值至少是 $2$。
# 解题思路
数位 $DP$,用记忆化搜索来实现。设 $dp[i][j]$ 表示现在已经枚举到第 $i$ 位,第 $i+1$ 位是 $j$ 时一共有多少满足条件的数。
还是直接看代码里的注释吧。
# 放上代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int HA = ;
//这里要设置为233,不能设置为int_max,会炸
int n, m, dp[][], num[];
inline int Abs(int x) {
return x> ? x : -x;
}
inline int dfs(int l, int pre, bool limit, bool Zero) {
if(l == ) return ;
//如果所有的位置都枚举完了,这显然就是一种可行方案
if(!Zero && !limit && dp[l][pre]) return dp[l][pre];
//没有前导0和限制是才能用通用答案
int ans = , mx = limit ? num[l] : ;
for(int i=; i<=mx; i++) {
if(Abs(i-pre) < ) continue;
int tmp = (i== && Zero) ? -HA : i;
//如果有前导0并且现在这一位是0,那就设置为一个负数
ans += dfs(l-, tmp, limit && (i == mx), tmp==-HA);
//前面的位有限制并且这一位到达了最高的数字那么限制就可以传递给下一位
}
if(!limit && !Zero) dp[l][pre] = ans;
//没有限制没有前导0才能够成为通用的答案
return ans;
}
inline int solve(int x) {
//将x分解
memset(num, , sizeof(num));
int k = ;
while (x) {
num[++k] = x % ;
x /= ;
}
return dfs(k, -HA, true, true); //第k位之前的一定是前导0
}
int main() {
scanf("%d%d", &n, &m);
printf("%d", solve(m)-solve(n-)); //类似前缀和
}
「 Luogu P2657 」 windy数的更多相关文章
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- Luogu P2657 [SCOI2009]windy数
一道比较基础的数位DP,还是挺套路的. 首先看题,发现这个性质和数的大小无关,因此我们可以直接数位DP,经典起手式: \(f[a,b]=f(b)-f(a-1)\) 然后考虑如何求解\(f(x)\).我 ...
- 题解 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 ...
随机推荐
- 浅谈JAVA中如何利用socket进行网络编程(二)
转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...
- 关于ArcGis for javascrept查询ArcGis server图层信息的方式
方式一: queryTask方式: 该方式用于单个图层的条件查询(不能跨图层查询) 1. 创建query对象 query = new esri.tasks.Query(); 2. 给query对象设置 ...
- oauth X-Frame-Options 跳转授权页面时,302重定向禁用iframe
因为oauth/authorize响应头包含X-Frame-Options: DENY解决方案:openresty nginx 移除该属性,经测试生效 more_clear_headers X-Fra ...
- 构造 BestCoder Round #52 (div.2) 1001 Victor and Machine
题目传送门 题意:有中文版的 分析:首先要知道机器关闭后,w是清零的.所以一次(x + y)的循环弹出的小球个数是固定的,为x / w + 1,那么在边界时讨论一下就行了 收获:这种题目不难,理解清楚 ...
- 如何用PS快速做出3D按钮效果的图片
1 先建立一个透明图层 2:再创建一个矩形 3:选用过喷样式 4: 双击图层并应用蓝色,记得这里应该复制下颜色的16进制值. 效果如图所示 取消光泽选项,大功告成! 最终效果如图所示,将其保存为PNG ...
- math数学函数
Console.WriteLine("Math.Sign(12)--->{0})", Math.Sign(12)) Console.WriteLine("math. ...
- java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
在做android解析服务器传来的json时遇到的错误. 服务器传来的数据格式 [{"," id":"7ef6815938394fce88a5873312b66 ...
- Git ---创建和切换分支
······································································"天下武功,唯快不破" git分支: g ...
- ibatis 的sqlMap 的xml 关注点
1.当有特殊字符时候需要保持原状 eg:特殊字符 <> 错误:t.name<>' ' 会报The content of elements must consist of ...
- Objective-C Memory Management Being Exceptional 异常处理与内存
Objective-C Memory Management Being Exceptional 异常处理与内存 3.1Cocoa requires that all exceptions mu ...