hdu2089(數位dp入門題)


不要62

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 18577    Accepted Submission(s): 6233


Problem Description
杭州人稱那些傻乎乎粘嗒嗒的人爲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
數位dp模板提


#include<stdio.h>
#include<cstring>
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<queue>
#include<map>
#include<utility>
#include<string>
#include<algorithm>
#define LL __int64
#define MOD 1000000007
#define M 100010
using namespace std;
int n,m;
int dp[10][10];
void init()
{
    dp[0][0]=1;//dp[i][j]means length is euqal to i and begins with j
    for(int i=1;i<=8;i++)
    {
        for(int j=0;j<=9;j++)
        {
            for(int k=0;k<=9;k++)
                if(j!=4&&!(j==6&&k==2))dp[i][j]+=dp[i-1][k];
        }
    }
}
int work(int x)
{
    int ans=0,L=0,a[10];
    for(int i=1;x;i++){a[i]=x%10;x/=10;L++;}a[L+1]=0;
    for(int i=L;i>=1;i--)
    {
        for(int j=0;j<a[i];j++)
        {
            if(j!=4&&!(j==2&&a[i+1]==6))ans+=dp[i][j];
        }
        if(a[i]==4||(a[i+1]==6&&a[i]==2))break;
    }
    return ans;
}
int main()
{
    init();
    while(~scanf("%d%d",&n,&m)&&n+m)
    {
        printf("%d\n",work(m+1)-work(n));
    }
    return 0;
}

數據規模不大,直接預處理

#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<utility>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#define Inf (1<<30)
#define LL long long
#define MOD 1000000009
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int dp[1000010];
bool judge(int x)
{
    int last=x%10;
    x/=10;
    if(last==4)return 0;
    while(x>0)
    {
        int now=x%10;
        x/=10;
        if(now==6&&last==2)return 0;
        if(now==4)return 0;
        last=now;
    }
    return 1 ;
}
void init()
{
    for(int i=1;i<=1000000;i++)
    {
        if(judge(i))dp[i]=1+dp[i-1];
        else dp[i]=dp[i-1];
    }
}
int main()
{
    int T;
    int n,m;
    init();
    //freopen("D:\\oo.txt","r",stdin);
    while(~scanf("%d%d",&n,&m)&&n+m)
    {
        printf("%d\n",dp[m]-dp[n-1]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章