### 洛谷 P2657 题目链接 ###

题目大意:给你一个数的范围 [A,B] ,问你这段区间内,有几个数满足如下条件:

1、两个相邻数位上的数的差值至少为 2 。

2、不包含前导零。

很简单的数位DP,可想只需标记前导零 lead, 前一个数 pre ,即可暴力统计答案,再记忆化就行了,但是有些地方还要细心一点。

比如在枚举到第一个有效位时(即非前导零),它当前只有一个数,而我们需要设 q = true (q 表示枚举到当前位时,是否满足条件,即相邻位之差是否达到 2 )。即我需要保证枚举到第二个有效数位时,要与第一个有效数位作差值比较的话,那么在枚举第一个有效位时,不能使得 q == false。

然后根据样例 1 可以知道,个位数也算。那么为了使第一位满足 abs(i - pre)>= 2 的话,那么我们需要使得一开始 pre == -1 即可,因为 i 最少会为 1 。

代码如下:

根据条件枚举数位

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
int A,B;
int a[],dp[][];
ll dfs(int pos,int pre,bool lead,bool limit){
if(pos==) return ;
if(!limit&&!lead&&dp[pos][pre]!=-) return dp[pos][pre];
int up=limit?a[pos]:;
ll res=;
for(int i=;i<=up;i++){
if(lead&&i==) res+=dfs(pos-,-,true,limit&&i==a[pos]);
else{
if(abs(i-pre)>=){
res+=dfs(pos-,i,false,limit&&i==a[pos]);
}
}
}
if(!limit&&!lead) dp[pos][pre]=res;
return res;
}
ll solve(ll x)
{
int pos=;
while(x){
a[++pos]=x%;
x/=;
}
return dfs(pos,-,true,true);
}
int main()
{
//freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
memset(dp,-,sizeof(dp));
while(~scanf("%d%d",&A,&B)){
printf("%lld\n",solve(B)-solve(A-));
}
}

直接枚举,根据 q 值判断是否正确。需要三维 DP 来保存 q 的状态。

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
int A,B;
int a[],dp[][][];
ll dfs(int pos,int pre,bool q,bool lead,bool limit){
if(pos==) return q;
if(!limit&&!lead&&dp[pos][pre][q]!=-) return dp[pos][pre][q];
int up=limit?a[pos]:;
ll res=;
for(int i=;i<=up;i++){
if(lead&&i==) res+=dfs(pos-,pre,q,true,limit&&i==a[pos]);
else res+=dfs(pos-,i,q&&(abs(pre-i)>=),false,limit&&i==a[pos]);
}
if(!limit&&!lead) dp[pos][pre][q]=res;
return res;
}
ll solve(ll x)
{
int pos=;
while(x){
a[++pos]=x%;
x/=;
}
return dfs(pos,-,true,true,true);
}
int main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
memset(dp,-,sizeof(dp));
scanf("%d%d",&A,&B);
printf("%lld\n",solve(B)-solve(A-));
}

洛谷 P2657 (数位DP)的更多相关文章

  1. 洛谷P2657 [SCOI2009]windy数 [数位DP,记忆化搜索]

    题目传送门 windy数 题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个win ...

  2. 洛谷 - P2657 - windy数 - 数位dp

    https://www.luogu.org/problemnew/show/P2657 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. 这道题是个显然到不能再显然的数位dp了. 来个 ...

  3. 洛谷P2657 [SCOI2009]windy数 题解 数位DP

    题目链接:https://www.luogu.com.cn/problem/P2657 题目大意:找区间 \([A,B]\) 范围内 不含前导零 且 相邻两个数字之差至少为2 的正整数的个数. 题目分 ...

  4. 洛谷P2657 windy数 [SCOI2009] 数位dp

    正解:数位dp 解题报告: 传送门! 这题一看就是个数位dp鸭,"不含前导零且相邻两个数字之差至少为2"这种的 然后就直接套板子鸭(板子戳总结,懒得放链接辣QAQ 然后就是套路 然 ...

  5. 洛谷教主花园dp

    洛谷-教主的花园-动态规划   题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...

  6. 洛谷——P2657 [SCOI2009]windy数

    P2657 [SCOI2009]windy数 题目大意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和 ...

  7. C++ 洛谷 P2657 [SCOI2009]windy数 题解

    P2657 [SCOI2009]windy数 同步数位DP 这题还是很简单的啦(差点没做出来 个位打表大佬请离开(包括记搜),我这里讲的是DP!!! 首先Cal(b+1)-Cal(a),大家都懂吧(算 ...

  8. 洛谷 p6858 深海少女与胖头鱼 洛谷月赛 期望dp

    洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...

  9. 洛谷P2657 Loj10165 SCOI2009 windy数

    题目描述 windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道, 在A和B之间,包括A和B,总共有多少个windy数? 输入输出格式 输 ...

随机推荐

  1. 以太网驱动的流程浅析(四)-以太网驱动probe流程【原创】

    以太网驱动的流程浅析(四)-以太网驱动probe流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...

  2. APScheduler学习

    说明 APScheduler是一个 Python 定时任务框架,使用起来十分方便.提供了基于日期.固定时间间隔以及 crontab 类型的任务,并且可以持久化任务.并以 daemon 方式运行应用. ...

  3. Django django-cors-headers实现防跨域

    安装 pip install django-cors-headers 注册应用 INSTALLED_APPS = ( ... 'corsheaders', ... ) 中间层设置 MIDDLEWARE ...

  4. 系统重装/装Anaconda后,Windows开始菜单缺少快捷方式解决方案

    系统重装后,想把D盘的软件添加快捷方式 以下以anaconda3为例,提供两种方法 方法一: 参考:  装Anaconda后,Windows开始菜单缺少快捷方式解决方案 方法二: 1. 添加环境变量 ...

  5. swoole怎么保持不掉线

    正常情况下客户端中断TCP连接时,会发送一个FIN包,进行4次断开握手来通知服务器.但一些异常情况下,如客户端突然断电断网或者网络异常,服务器可能无法得知客户端已断开连接. 尤其是移动网络,TCP连接 ...

  6. leetcode-字符串篇

    Implement strStr() /** * Implement strStr(). *  * Return the index of the first occurrence of needle ...

  7. mysql中的事务隔离级别

    事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典的.经常被拿出来说的例子就是转账了.假如小花要给小白转账1000元,这个转账会涉及到两个关键操作就是:将小花的余额-1000,将小白的余额 ...

  8. css样式优先级计算规则

    css样式的优先级分为引入优先级和声明优先级. 引入优先级 引入样式一般分为外部样式,内部样式,内联样式. 外部样式:使用link引入的外部css文件. 内部样式:使用style标签书写的css样式. ...

  9. Maven学习 --- <distributionManagement>

    在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次.我们知道,maven的依赖管理是基于版本管理的, ...

  10. Netty服务端Channel注册Selector及绑定服务器端口

    当服务端Channel 创建并且初始化完成之后,会将其注册到 selector,通过语句config().group().register(channel)进行注册工作,该方法最终调用 Abstrac ...