当前位置: 代码迷 >> 综合 >> 不要62//HDU - 2089//数位dp
  详细解决方案

不要62//HDU - 2089//数位dp

热度:68   发布时间:2024-01-10 06:50:09.0

不要62//HDU - 2089//数位dp


题目

杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
Sample Input
1 100
0 0
Sample Output
80
链接:https://vjudge.net/contest/349029#problem/I

思路

数位dp(差不多是模板)

代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[10][2];//二维表示前一位是否6
int a[10];//当前数的每一位int dfs(int pos,int pre,int state,int limit){
      //pre表示前一位if(pos == -1)return 1;if(!limit&&dp[pos][state]!=-1)return dp[pos][state];int up = limit ? a[pos] : 9;int temp = 0;for(int i = 0;i <= up ; i++){
    if(pre == 6&&i == 2)continue;if(i == 4)continue;temp+=dfs(pos-1,i,i == 6,limit &&i == a[pos]);}if(limit==0)dp[pos][state] = temp;return temp;}
int findx(int x){
    int pos = 0;while(x){
    a[pos++] = x%10;x/=10;}return dfs(pos-1,-1,0,1);
}
int main(){
    int left,right;memset(dp,-1,sizeof(dp));while(1){
    scanf("%d%d",&left,&right);if(left+right==0) break;printf("%d\n",findx(right)-findx(left-1));}return 0;
}

注意