HDU 2089 不要62【数位板】

Description:

不吉利的数字为所有含有4或62的号码。输出n-m之间的吉利数的个数!

Analyse:

数位dp的原理:如果A<B那么,从高位到低位A一定出现某digit小于B‘s。

对于数位dp板,重点是参数的设置!

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<deque>
#include<stack>
#include<map>
#include<set>
#define INF 0x7fffffff
#define SUP 0x80000000
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

typedef long long LL;
const int N=100007;

int dig[2][10];
LL dp[10][10][2],id;

void mod10(int iid,LL n)
{
    int id=1;
    while(n)
    {
        dig[iid][id++]=n%10;
        n/=10;
    }
    dig[iid][0]=id-1;
}

//pos:当前位置
//pre:前digit
//en:是否出现过含4/62的数,如果含的话返回 1;
//limit:看前一位是否限制,如果pre=digit[pos+1],那么当前位只能去digit[pos],否则可以取到0-9!  见233处
LL dfs(int pos,int pre,int en,int limit)
{
    if(pos<1) return en;
    if(!limit&&dp[pos][pre][en]!=-1)
        return dp[pos][pre][en];

    int last=limit?dig[id][pos]:9;  //233
    LL ret=0;
    for(int i=0;i<=last;i++)
        ret+=dfs(pos-1,i,en||(pre==6&&i==2)||i==4,limit&&(i==last));
    if(!limit)       //为什么,dp要计入没限制的值,,假如有限制,你认为dp[pos][pre][en]还会一样么?,,0-digit[pos],而不是0-9,而digit[pos]又各异!
        dp[pos][pre][en]=ret;
    return ret;
}

int main()
{
    LL n,m;
    while(scanf("%I64d%I64d",&n,&m)==2,n+m)
    {
        LL nn,mm;
        mem(dp,-1);
        mod10(0,--n);
        mod10(1,m);
        id=0;
        nn=dfs(dig[id][0],0,0,1);
        id=1;
        mm=dfs(dig[id][0],0,0,1);

        printf("%I64d\n",LL(m-n)-(mm-nn));//s-补集

    }
    return 0;
}
时间: 2024-10-21 01:10:23

HDU 2089 不要62【数位板】的相关文章

hdu 2089 不要62 (数位dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 思路:用变量记录吉利数,和最高位为2的吉利数还有不是吉利数的个数... code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[10][3]; //dp[i][j] ,i表示位数,j表示状态<pre name="code"

[ACM] hdu 2089 不要62(数位Dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19043    Accepted Submission(s): 6442 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就

HDU 2089 不要62(数位DP,三种姿势)

HDU 2089 不要62(数位DP,三种姿势) ACM 题目地址:HDU 2089 题意: 中文题意,不解释. 分析: 100w的数据,暴力打表能过 先初始化dp数组,表示前i位的三种情况,再进行推算 直接dfs,一遍搜一变记录,可能有不饥渴的全部算和饥渴的部分算情况,记录只能记录全部算(推荐看∑大的详细题解Orz) 代码: 1. 暴力 (以前写的) /* * Author: illuz <iilluzen[at]gmail.com> * File: 2089_bf.cpp * Create

HDU - 2089 不要62 (暴力或数位DP)

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

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,而百

【数位DP】HDU 2089 不要62

http://acm.hdu.edu.cn/showproblem.php?pid=2089 [AC] 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int maxn=1e6+2; 5 int dp[10][10]; 6 int digit[10]; 7 int cnt; 8 int ans; 9 int n,m; 10 bool check() 11 { 12 for(int

hdu 2089 不要62 【数位DP】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位DP模板题,测试板子 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functional> #include &l

hdu 2089 不要62

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 41353    Accepted Submission(s): 15070 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

HDU 2089 —— 不要62

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 7341