### 洛谷 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[12],dp[12][12];
ll dfs(int pos,int pre,bool lead,bool limit){if(pos==0) return 1;if(!limit&&!lead&&dp[pos][pre]!=-1) return dp[pos][pre];int up=limit?a[pos]:9;ll res=0;for(int i=0;i<=up;i++){if(lead&&i==0) res+=dfs(pos-1,-1,true,limit&&i==a[pos]);else{if(abs(i-pre)>=2){res+=dfs(pos-1,i,false,limit&&i==a[pos]);}}}if(!limit&&!lead) dp[pos][pre]=res;return res;
}
ll solve(ll x)
{int pos=0;while(x){a[++pos]=x%10;x/=10;}return dfs(pos,-1,true,true);
}
int main()
{//freopen("test.in","r",stdin);
//    freopen("test.out","w",stdout);memset(dp,-1,sizeof(dp));while(~scanf("%d%d",&A,&B)){printf("%lld\n",solve(B)-solve(A-1));
}
}

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

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

转载于:https://www.cnblogs.com/Absofuckinglutely/p/11441584.html

洛谷 P2657 (数位DP)相关推荐

  1. 洛谷P2657 [SCOI2009]windy数

    洛谷P2657 [SCOI2009]windy数 本题是一道数位DP 看程序应该能看懂 中心思想:把一个数拆成每一位来处理 代码: #include<bits/stdc++.h> usin ...

  2. 洛谷 P2657 [SCOI2009] windy数 数位DP

    大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...

  3. 数位dp入门题 洛谷P2657 [SCOI2009] windy 数

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

  4. 洛谷 P2657 [SCOI2009] windy 数 (题解+代码)

    题目传送门:https://www.luogu.com.cn/problem/P2657 题解: 数位dp 计算给定数字所有数位上的值 然后从高位到低位暴力枚举所有的情况 当前一个位置上限时,当前最大 ...

  5. 洛谷P2657 windy 数 数位dp

    题目背景 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总共 ...

  6. BZOJ1026 || 洛谷P2657 [SCOI2009]windy数【数位DP】

    Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. ...

  7. 洛谷1846 游戏 dp

    题目链接 题意: 给定两个正整数数列,你要用它们来做一个游戏:你需要对数列进行若干次操作,每一次操作,应选择两个正整数K1和K2 ,并删除第一个数列的最后K1个数,计算出它们的和S1:删除第二个数列的 ...

  8. 洛谷P3146 区间dp做题笔记

    不是题解,不是题解,不是题解,纯属个人笔记,不知所言. 传送门:P3146 问:什么时候才能写的一手漂亮的dp? 答:夜深人静之时,魂归故里之日. 此题是一道基础的区间dp的题,看完题解犹豫片刻,之后 ...

  9. 洛谷1373(dp)

    常规线性dp,需要时就加一维.\(dp[i][j][t][s]\)表示在点\((i,j)\)时瓶子里剩\(t\)且为\(s\)走(0代表小a,1代表uim)时的方案数. de了半天发现是初次尝试的快速 ...

最新文章

  1. NBT:Rob Knight团队发表微生物组数据降维新方法
  2. PNN神经网络预测类别的例子
  3. hdu 1568 Fibonacci 对数。。
  4. 使用gridlayout布局后,因某些原因又删除,并整理目录结构时,Unable to resolve target 'android-7'
  5. html校园首页设计说明范文,网页设计作品设计说明-必看请相互转告
  6. Hadoop相关技术
  7. 风变编程python论文_如何看待风变编程的 Python 网课?
  8. python核心教程_python核心教程--第四章
  9. 为什么Linux不需要碎片整理?
  10. php base64图片大小,php 图片 base64编码相互转换
  11. JSP:Cookie实现永久登录(书本案例)
  12. excel 输入自动更新的时间和日期
  13. 如何制作bt种子文件
  14. TMEA:源于音乐,高于盛典
  15. 重启共享文件服务器,windows server 2008 文件服务器不定期出现大量CLOSE_WAIT状态的连接,必须重启服务器,客户端才能访问共享。...
  16. FPS通用的方框透视公式的原理
  17. 微信文章爬虫demo -- 综合实验和练习
  18. (淘宝无限适配)手机端rem布局
  19. upupoo为什么服务器维护中,upupoo怎么隐藏桌面图标 只需两步轻松隐藏
  20. javaweb后台区分手机或是电脑登录

热门文章

  1. 权力的游戏 —— 5G多媒体的全球标准(附部分视频)
  2. Mac快捷键大全(常用的可以修改)
  3. 修复青龙白屏登录界面以及脚本管理等界面白屏问题
  4. 全网最全资源需要的看过来---分享是一种情怀
  5. Mesh与WiFi的区别
  6. ganymed-ssh2使用
  7. 复杂系统学习(一):复杂系统简介
  8. 如何修复因卸载ccleaner导致的回收站损坏
  9. 实验05:算法设计策略的比较与选择
  10. SQL Server 2012 未将对象引用设置到对象的实例。(SQLEditors)