10.16复习 数位DP——不要62

Description

  杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
  杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
  不吉利的数字为所有含有4或62的号码。例如:
  62315 73418 88914
  都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
  你的任务是,对于每次给出的一个牌照区间号,推断出交管局今后又要实际上给多少辆新的士车上牌照了。

Input

输入的都是整数对n、m(0<n≤m<100000000000),如果遇到都是0的整数对,则输入结束。

Output

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

Sample Input

1 100
0 0

Sample Output

80

板子*1

code:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 int dp[1000][100];
 6 int a[10000];
 7 int dfs(int len,int is6,bool ismax){
 8     if(!len)return 1;
 9     if(!ismax&&dp[len][is6]>=0)return dp[len][is6];
10     int cnt=0,max0=(ismax?a[len]:9);
11     for(int i=0;i<=max0;i++){
12         if(i==4||(is6&&i==2))continue;
13         cnt+=dfs(len-1,i==6,ismax&&i==max0);
14     }
15     return ismax?cnt:dp[len][is6]=cnt;
16 }
17 int check(int x){
18     int cnt=0;
19     while(x){
20         a[++cnt]=x%10;
21         x/=10;
22     }
23     return dfs(cnt,0,true);
24 }
25 int main(){
26     memset(dp,-1,sizeof dp);
27     int l,r;
28     cin>>l>>r;
29     cout<<check(r)-check(l-1);
30     return 0;
31 }

over

原文地址:https://www.cnblogs.com/saionjisekai/p/9800842.html

时间: 2024-10-24 19:50:12

10.16复习 数位DP——不要62的相关文章

ACM之路(16)—— 数位DP

题目就是kuangbin的数位DP. 先讲C题,不要62,差不多就是一个模板题.要注意的是按位来的话,光一个pos是不够的,还需要一维来记录当前位置是什么数字,这样才能防止同一个pos不同数字的dp值混在一起.直接丢代码: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <vector> 6 #in

数位DP 不要62

数位DP的问法是从某个数到某个数的区间里,求出满足题目要求的个数: 如本题所说的不要62和4,就是求出这个区间内,满足这一条件的数: 比如问 6 199的这个区间内满足条件的数,那么就求出1到199满足的数减去1到(6-1)满足的数即可: 那么 具体怎么从操作呢? 首先,我们先求出这个数的a[]数组,求出每一位具体是什么数(dfs的时候需要用到) 然后开始dfs,从最高位开始逐步深搜下来,将不满足的情况过滤掉,然后将满足普遍情况的值保存下来 那么哪些是普遍情况呢:就是无论不会被限制条件限制掉的状

[动态规划][数位dp]不要62

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多

HDU 2089 数位dp入门

开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; int n,m; /

HDU 4389 X mod f(x) (数位DP)

题目链接  HDU4389 题意  给出T个区间[L, R],统计L到R中有多少个满足条件的数. 限制条件为该数能被这个数的各位数字之和整除. 数据范围$1 <= L <= R <= 10^{9}$ 考虑数位DP 注意到f(x)最大为81,所以对1-81每一个和做一遍数位DP即可. f[pos][mod][sum][x] 表示当前处理到第pos位,当前的数位和对x取模的结果,当前的数位和,以及当前正在求的x = f(x) #include <bits/stdc++.h> us

[数位dp+状态压缩] hdu 4352 XHXJ&#39;s LIS

题意: 给x.y.k,在[x,y] 范围内最长上升子序列长度是k的数有几个 思路: 模仿 LIS nlogn的想法,这里就只有10个数,进行状压 然后直接搜就好了不用二分 然后按位dp下去就ok了! 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"queue" #include"al

[HDOJ2089]不要62(数位DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:~~~ 数位dp,dp(i,j)表示i位数最后一位是6时或者不是6时的符合条件的数量,从高位到低位扩展. 假如i位数的最后一位是6,那么再扩展到i+1位的时候2是一定不能紧随其后的,否则2是可以出现的.但是这两种情况里4是都不允许的. 要求一个区间内满足条件的数字个数,可以用区间相减来得到结果. 1 #include <bits/stdc++.h> 2 using namespace

hdu 2089 不要62【数位dp】

HDU 2089 求给定区间内不含62和4的数的个数. 数位dp入门.从这里我清楚了一些数位dp的用法.比如limit是判断是否达到上界,而且需要判断(!limit)..比如若题目要求不含11的个数,举例来说:区间在[1,215],当百位开始枚举为0时,十位枚举1,个位可以取0,2~9,即dp[0][1]=9,表示枚举到个位前一位为1时满足的个数,当然此时除了1都满足.而回溯枚举到百位为2,十位为1时,由于dp[0][1]已经枚举了,可以直接返回,但此时返回时有错误的,dp[0][1]=9,而百

HDU 2089:不要62(数位DP)

http://acm.hdu.edu.cn/showproblem.php?pid=2089 不要62 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但