题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089

题意

求一个区间内,不出现4和连续的62的数的个数。

分析

可以暴力打表。也可以数位DP。

设:

dp[i][0],表示长度为i,不存在不吉利数字
dp[i][1],表示长度为i,不存在不吉利数字,且最高位为2
dp[i][2],表示长度为i,存在不吉利数字

状态定义好了,转移比较简单。

在计算时,按位分解,考虑当前位能否放4或6,详情看代码。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<bitset>
#include<map>
#include<deque>
#include<stack>
using namespace std;
typedef pair<int,int> pii;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
typedef long long ll;
#define ms(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
const int maxn = 1e6;
const int mod = 1e9+7;#define lson l,m,2*rt
#define rson m+1,r,2*rt+1
int dp[10][3];void init(){dp[0][0]=1;dp[0][1]=dp[0][2]=0;for(int i=1;i<7;i++){dp[i][0]=9*dp[i-1][0]-dp[i-1][1]; //在最高位加上除4以外的9个数字,但要减掉2之前加上6dp[i][1]=dp[i-1][0]; //在不含不吉利数字的最高位加上2dp[i][2]=dp[i-1][0]+dp[i-1][1]+10*dp[i-1][2];     //在已有不吉利数字前加任意数字,或者无不吉利数字的最高位加4,或者在2前面加6}
}
int bit[10];int solve(int x){int t=x;int len=0;while(t){bit[++len]=t%10;t/=10;}bit[len+1]=0;int ans=0;bool flag=false;for(int i=len;i>=1;i--){ans += dp[i-1][2]*bit[i];if(flag) ans+=dp[i-1][0]*bit[i]; //高位已经出现4或者62,后面随意else{if(bit[i]>4) ans+=dp[i-1][0]; if(bit[i+1]==6&&bit[i]>2) ans+=dp[i][1];if(bit[i]>6) ans+=dp[i-1][1];}if(bit[i]==4 || (bit[i+1]==6&&bit[i]==2)) flag=true;}if(flag) ans++;return x-ans;
}
int main(){
#ifdef LOCALfreopen("in.txt","r",stdin);
#endif // LOCALint l,r;init();while(scanf("%d%d",&l,&r)&&(l||r)){printf("%d\n",solve(r)-solve(l-1));}return 0;
}

以下是暴力打表的代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<queue>
#include<vector>
#include<bitset>
#include<map>
#include<deque>
#include<stack>
using namespace std;
typedef pair<int,int> pii;
#define X first
#define Y second
#define pb push_back
#define mp make_pair
typedef long long ll;
#define ms(a,b) memset(a,b,sizeof(a))
const int inf = 0x3f3f3f3f;
const int maxn = 1e6;
const int mod = 1e9+7;#define lson l,m,2*rt
#define rson m+1,r,2*rt+1
int dp[maxn+5];void init(){dp[0]=0;for(int i=1;i<maxn;i++){dp[i]=dp[i-1];bool f=0;int pre=0;int x=i;while(x){if(x%10==4){f=1;break;}else if(pre==2&&x%10==6){f=1;break;}pre=x%10;x/=10;}if(f){dp[i]++;}}
}int main(){
#ifdef LOCALfreopen("in.txt","r",stdin);
#endif // LOCALint l,r;init();while(scanf("%d%d",&l,&r)&&(l||r)){printf("%d\n",r-l+1-(dp[r]-dp[l-1]));}return 0;
}

转载于:https://www.cnblogs.com/fht-litost/p/8969961.html

HDU 2089 不要62(数位DP)相关推荐

  1. HDU 2089 不要62 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题目描述: 给定一个区间, 让你求这个区间中所有不带62 或 4 的数的个数 解题思路: 很明 ...

  2. Hdu 2089-不要62 数位dp

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Time Limit: 1000/1000 MS (Java/Others)    Me ...

  3. HDU - 2089 不要62 【暴力打表】【数位DP】

    不要62 HDU - 2089 题意 求区间[n,m]之间有多少个数字不含4或者连续的62 解法1 由于数据范围是0~1e6,所以直接暴力判断每一位数字是否含有4或者62,然后求前缀和即可 #incl ...

  4. hdu 2089 不要62【数位dp】

    HDU 2089 求给定区间内不含62和4的数的个数. 数位dp入门.从这里我清楚了一些数位dp的用法.比如limit是判断是否达到上界,而且需要判断(!limit)..比如若题目要求不含11的个数, ...

  5. [HDU]2089不要62

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 这道题跟Bomb(http://www.cnblogs.com/sjy123/p/3247731.html ...

  6. 不要62 ---数位DP

    题意:求m到n中不含62和4的数的个数. 题目链接 思路:数位dp模板求满足的数字或不满足的数字,刚学,就求不满足的数. #include<stdio.h> #include<str ...

  7. HDU 6156 Palindrome Function 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6156 题目描述: 求L~R所有的数的l~r进制的f(x), f(x) = 当前进制 如果回文串, f ...

  8. hdu2089 不要62 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. HDU 2089 不要62

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).  杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障 ...

最新文章

  1. Python——Entry、Text控件
  2. 深圳杯---无线回传拓扑规划
  3. 小猿圈Python之实现京东秒杀功能代码
  4. 动态使用webservice,以及含有ref类型的参数的问题
  5. 开启Apache mod_rewrite模块完全解答
  6. Java基础----对象与类
  7. lca---tarjan算法
  8. DLL文件无法删除怎么解决
  9. java矩阵连乘_算法设计与分析——矩阵连乘问题(动态规划)
  10. python 元组和列表区别_Python干货整理:一分钟了解元组与列表使用与区别
  11. jQuery 一些操作
  12. TreeView递归系统目录
  13. 课程目标 线程 java 1615387415
  14. Linux——用户管理简单学习笔记(三)
  15. 测试接口python常用命令_用python实现接口测试(四、操作MySQL)-阿里云开发者社区...
  16. qt新建html5,QT Creator无法创建纯C++项目或HTML5项目(QT Creator直接关闭)
  17. nginx关于错误页面重定向的问题
  18. P3373 线段树2(多重标记线段树)题解
  19. 通信电子线路实验-调幅模块仿真(发送与接收)
  20. excel自动填充下方相同数据

热门文章

  1. WSUS客户端无法发现
  2. 下拉式菜单在GridView编辑时联动选择
  3. 如何选择WEB报表工具(二)
  4. python五行代码解决滑块验证的缺口距离识别,破解滑块验证...
  5. Redis配置文件(3)常见的配置修改
  6. k8s与监控--解读prometheus监控kubernetes的配置文件
  7. 【hrbust2294】方方正正
  8. -bash-4.1问题
  9. 09-Windows Server 2012 R2 会话远程桌面-标准部署-使用PowerShell进行部署2-2
  10. ABAP操作Excel(转)