洛谷 P2657 (数位DP)
### 洛谷 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)相关推荐
- 洛谷P2657 [SCOI2009]windy数
洛谷P2657 [SCOI2009]windy数 本题是一道数位DP 看程序应该能看懂 中心思想:把一个数拆成每一位来处理 代码: #include<bits/stdc++.h> usin ...
- 洛谷 P2657 [SCOI2009] windy数 数位DP
大家觉得写还可以,可以点赞.收藏.关注一下吧! 也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn 文章目录 P2657 [SCOI2009 ...
- 数位dp入门题 洛谷P2657 [SCOI2009] windy 数
题干 传送门 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总 ...
- 洛谷 P2657 [SCOI2009] windy 数 (题解+代码)
题目传送门:https://www.luogu.com.cn/problem/P2657 题解: 数位dp 计算给定数字所有数位上的值 然后从高位到低位暴力枚举所有的情况 当前一个位置上限时,当前最大 ...
- 洛谷P2657 windy 数 数位dp
题目背景 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2 的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总共 ...
- BZOJ1026 || 洛谷P2657 [SCOI2009]windy数【数位DP】
Time Limit: 1 Sec Memory Limit: 162 MB Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. ...
- 洛谷1846 游戏 dp
题目链接 题意: 给定两个正整数数列,你要用它们来做一个游戏:你需要对数列进行若干次操作,每一次操作,应选择两个正整数K1和K2 ,并删除第一个数列的最后K1个数,计算出它们的和S1:删除第二个数列的 ...
- 洛谷P3146 区间dp做题笔记
不是题解,不是题解,不是题解,纯属个人笔记,不知所言. 传送门:P3146 问:什么时候才能写的一手漂亮的dp? 答:夜深人静之时,魂归故里之日. 此题是一道基础的区间dp的题,看完题解犹豫片刻,之后 ...
- 洛谷1373(dp)
常规线性dp,需要时就加一维.\(dp[i][j][t][s]\)表示在点\((i,j)\)时瓶子里剩\(t\)且为\(s\)走(0代表小a,1代表uim)时的方案数. de了半天发现是初次尝试的快速 ...
最新文章
- NBT:Rob Knight团队发表微生物组数据降维新方法
- PNN神经网络预测类别的例子
- hdu 1568 Fibonacci 对数。。
- 使用gridlayout布局后,因某些原因又删除,并整理目录结构时,Unable to resolve target 'android-7'
- html校园首页设计说明范文,网页设计作品设计说明-必看请相互转告
- Hadoop相关技术
- 风变编程python论文_如何看待风变编程的 Python 网课?
- python核心教程_python核心教程--第四章
- 为什么Linux不需要碎片整理?
- php base64图片大小,php 图片 base64编码相互转换
- JSP:Cookie实现永久登录(书本案例)
- excel 输入自动更新的时间和日期
- 如何制作bt种子文件
- TMEA:源于音乐,高于盛典
- 重启共享文件服务器,windows server 2008 文件服务器不定期出现大量CLOSE_WAIT状态的连接,必须重启服务器,客户端才能访问共享。...
- FPS通用的方框透视公式的原理
- 微信文章爬虫demo -- 综合实验和练习
- (淘宝无限适配)手机端rem布局
- upupoo为什么服务器维护中,upupoo怎么隐藏桌面图标 只需两步轻松隐藏
- javaweb后台区分手机或是电脑登录