您的位置:首页 > 其它

HDU3555(数位DP)

2015-05-29 19:43 183 查看
题意:求区间[a,b],包含49的数有多少,这题只需把hdu2089稍微改下就行;

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;

LL dp[100][100];

void init(){
    dp[0][0] = 1;
    for(int i = 1; i <= 20; i++)
        for(int j = 0; j < 10; j++)
            for(int k = 0; k < 10; k++)
               if(!(j == 4 && k == 9))
                        dp[i][j] += dp[i-1][k];
}

LL solve(LL n){
    int d[100];
    int len = 0;

    while(n > 0){
        d[++len] = n%10;
        n /= 10;
    }

    d[len + 1] = 0;

    LL ans = 0;

    for(int i = len; i >= 1; i--){
        for(int j = 0; j < d[i]; j++){
            if(!(d[i+1] == 4 && j == 9)) ans += dp[i][j];
        }

        if((d[i] == 9 && d[i+1] == 4)) break;

    }

    return  ans;
}

int main()
{
#ifdef xxz
    freopen("in.txt","r",stdin);
#endif // xxz

    LL n,T;
    init();
    cin>>T;
    while(T--){
        cin>>n;

        cout<<n - (solve(n+1) - solve(1))<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: