码迷,mamicode.com
首页 > 其他好文 > 详细

【Hdu3555】 Bomb(数位DP)

时间:2017-12-23 12:06:09      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:多少   inline   main   script   eof   方案   else   set   +=   

Description

题意就是找0到N有多少个数中含有49。

\(1\leq N \leq2^{63}-1\)

Solution

数位DP,与hdu3652类似

\(F[i][state]\)表示位数为i,包含49状态为state时的方案数

注意开\(long long\)

Tips

注意N范围很大,位数不止10位!!

Code

#include <cstdio>
#include <cstring>
#define ll long long

int d[20];
ll dp[20][3],n,T;

inline ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

ll dfs(int p,int sta,int lim){
    ll &tmp=dp[p][sta],r=0;
    if(!lim&&tmp!=-1) return tmp;
    if(!p) return sta==2;
    
    int mx=lim?d[p]:9;
    for(int i=0;i<=mx;++i){
        int t=0;
        if(sta==2) t=2;
        else if(sta==1&&i==9) t=2;
        else if(i==4) t=1;
        r+=dfs(p-1,t,lim&&(i==mx));
    }
    return lim?r:tmp=r;
}

int main(){
    T=read();
    memset(dp,-1,sizeof(dp));
    while(T--){
        n=read();
        int len=0;
        while(n){
            d[++len]=n%10;
            n/=10; 
        }
        d[len+1]=0;
        printf("%lld\n",dfs(len,0,1));
    }
    return 0;
}

【Hdu3555】 Bomb(数位DP)

标签:多少   inline   main   script   eof   方案   else   set   +=   

原文地址:http://www.cnblogs.com/void-f/p/8092633.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!