hdu3555 数位dp

题意:求1到n的数中含49的有多少个

和上一题类似,但是这题如果直接算含49的会有一点问题,所以先算不含49的然后用n-就好了,注意求1到n算的是n+1的

还有就是这题有毒,必须要用__int64而不能用long long,而且需要交c++,不能用G++

非递归

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;

const double g=10.0,eps=1e-7;
const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;

__int64 f[N][N];
void init()
{
    memset(f,0,sizeof f);
    f[0][0]=1;
    for(int i=1;i<=20;i++)
        for(int j=0;j<=9;j++)
            for(int k=0;k<=9;k++)
            {
                if(j==4&&k==9)continue;
                f[i][j]+=f[i-1][k];
            }
}
__int64 getnum(__int64 x)
{
    __int64 ans=0,len=0,digit[30];
    while(x)
    {
        digit[++len]=x%10;
        x/=10;
    }
    for(int i=len;i>=1;i--)
    {
        for(int j=0;j<digit[i];j++)
            if(j!=9||digit[i+1]!=4)
               ans+=f[i][j];
        if(digit[i]==9&&digit[i+1]==4)break;
    }
    return ans;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    init();
    int t;
    cin>>t;
    while(t--)
    {
        __int64 n;
        cin>>n;
        cout<<n+1-getnum(n+1)<<endl;
    }
    return 0;
}
/********************

********************/
View Code

 递归

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define C 0.5772156649
#define pi acos(-1.0)
#define ll long long
#define mod 1000000007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;

const double g=10.0,eps=1e-7;
const int N=20+10,maxn=1000000+10,inf=0x3f3f3f;

__int64 dp[N][N],digit[N];
__int64 dfs(int len,bool state,bool fp)
{
    if(!len)return 1;
    if(!fp&&dp[len][state]!=-1)return dp[len][state];
    __int64 ans=0,fpmax=fp ? digit[len] : 9;
    for(int i=0;i<=fpmax;i++)
    {
        if(i==9&&state)continue;
        ans+=dfs(len-1,i==4,fp&&i==fpmax);
    }
    if(!fp)dp[len][state]=ans;
    return ans;
}
__int64 solve(__int64 x)
{
    int len=0;
    while(x)
    {
        digit[++len]=x%10;
        x/=10;
    }
    return dfs(len,0,1);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin>>t;
    memset(dp,-1,sizeof dp);
    while(t--)
    {
        __int64 n;
        cin>>n;
        cout<<n+1-solve(n)<<endl;
    }
    return 0;
}
/********************

********************/
View Code

 

posted @ 2017-08-23 13:12  walfy  阅读(117)  评论(0编辑  收藏  举报