洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]
windy数
题目描述
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
输入输出格式
输入格式:
包含两个整数,A B。
输出格式:
一个整数
输入输出样例
1 10
9
25 50
20
说明
100%的数据,满足 1 <= A <= B <= 2000000000 。
分析:
据大佬说这是一道数位DP模板???我DP不好别骗我QWQ。。。
好吧,一开始打了个暴搜看能水多少,可能我写挂了只拿10分QAQ???然后打了一下正解记忆化搜索,貌似真是一个数位DP模板???看来还是我太菜了。。。
这道题需要注意的就是当前搜索的情况如果是前导零或者顶端情况的时候需要特判,所以在搜索的时候加入两个bool变量判断一下,剩下的貌似真就是一个模板了。。。
Code:
//It is made by HolseLee on 22rd July 2018
//Luogu.org P2657
#include<bits/stdc++.h>
using namespace std;
int num[],dp[][];
inline int read()
{
char ch=getchar();int num=;
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<=''){
num=num*+ch-'';ch=getchar();}
return num;
}
inline int Abs(int x)
{
return x>?x:-x;
}
inline int dfs(int len,int las,bool top,bool zero)
{
if(len==)return ;
if(!top&&!zero&&dp[len][las]!=-)
return dp[len][las];
int cnt=,maxx=(top?num[len]:);
for(int i=;i<=maxx;i++){
if(Abs(i-las)<)continue;
int p=i;if(zero&&i==)p=-;
cnt+=dfs(len-,p,top&&(i==maxx),(p==-));
}
if(!zero&&!top)dp[len][las]=cnt;
return cnt;
}
inline int work(int x)
{
int tot=;
while(x){num[++tot]=x%;x/=;}
memset(dp,-,sizeof(dp));
return dfs(tot,-,true,true);
}
int main()
{
int x=read();int y=read();
printf("%d",work(y)-work(x-));
return ;
}
洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]的更多相关文章
- luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索
题目链接 luogu P2657 [SCOI2009]windy数 题解 我有了一种所有数位dp都能用记忆话搜索水的错觉 代码 #include<cstdio> #include<a ...
- 洛谷 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),大家都懂吧(算 ...
- 1026-windy数+数位DP+记忆化搜索
1026: [SCOI2009]windy数 题意:数位DP模板题: 目前只理解了记忆化搜索,就想练练手, ------给递推写法留一个位子 ------ 注意这道题要判断前导0的情况,1 )可以加一 ...
- 洛谷P2657 [SCOI2009]windy数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...
- P2657 [SCOI2009]windy数 数位dp
数位dp之前完全没接触过,所以NOIP之前搞一下.数位dp就是一种dp,emm……用来求解区间[L,R]内满足某个性质的数的个数,且这个性质与数的大小无关. 在这道题中,dp[i][j]代表考虑了i位 ...
- 题解 BZOJ1026 & luogu P2657 [SCOI2009]windy数 数位DP
BZOJ & luogu 看到某大佬AC,本蒟蒻也决定学习一下玄学的数位$dp$ (以上是今年3月写的话(叫我鸽神$qwq$)) 思路:数位$DP$ 提交:2次 题解:(见代码) #inclu ...
- [洛谷P2657][SCOI2009]windy数
题目大意:不含前导零且相邻两个数字之差至少为$2$的正整数被称为$windy$数.问$[A, B]$内有多少个$windy$数? 题解:$f_{i, j}$表示数有$i$位,最高位为$j$(可能为$0 ...
随机推荐
- PHP字符串定义方式和单引号双引号的区别
$str=<<<任意标记 ......................... .............................. 任何标记; 单引号和双引号的区别? ''号 ...
- Dubbo 管理控制台安装
Dubbo 管理控制台官网下载 https://github.com/alibaba/dubbo Dubbo 管控台可以对注册到 zookeeper 注册中心的服务或服务消费者进行管理,而且管控台是 ...
- Spark RDD中的aggregate函数
转载自:http://blog.csdn.net/qingyang0320/article/details/51603243 针对Spark的RDD,API中有一个aggregate函数,本人理解起来 ...
- [转]FILE的用法
#include <stdio.h> int main() { char c; ; FILE *file; file = fopen("test.txt", " ...
- json格式的一些常用操作方法
package com.liveyc.restfull.until; import java.util.HashMap; import java.util.Iterator; import java. ...
- bzoj 2653 二分答案+可持久化线段树
首先离散化,然后我们知道如果对于一个询问的区间[l1,r1],[l2,r2],我们二分到一个答案x,将[l1,r2]区间中的元素大于等于x的设为1,其余的设为-1,那么如果[l1,r1]的最大右区间和 ...
- Unity 添加鼠标右键事件
把此类放到 Editor下使用就OK using UnityEngine; using System.Collections; using System.Collections.Generic; us ...
- leetcode.C.4. Median of Two Sorted Arrays
4. Median of Two Sorted Arrays 这应该是最简单最慢的方法了,因为本身为有序,所以比较后排序再得到中位数. double findMedianSortedArrays(in ...
- Sublime text 3中文汉化教程
想弄个中文版的sublime,居然可以不用重新下载汉化包或者重新下载简体中文版了~而是只需要安装个插件即可! 工具/原料 电脑 sublime text3编辑器 方法/步骤 启动并进入s ...
- idea docker 连接 linux 上的 docker
安装插件 Docker插件,首先需要在你的IDEA中安装Docker插件,定位到File-Setting-Plugins后搜索Docker Integration安装 配置Docker服务器,在IDE ...