hdu3555数位dp

来源:互联网 发布:电脑怎么连接宽带网络 编辑:程序博客网 时间:2024/05/21 00:00

题目大意:找在0~n范围内有多少个49!

思路:和hdu2089一样的题目


#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <fstream>#include <algorithm>#include <cmath>#include <queue>#include <stack>#include <vector>#include <map>#include <set>#include <iomanip>using namespace std;//#pragma comment(linker, "/STACK:102400000,102400000")#define maxn 70#define MOD 1000000007#define mem(a , b) memset(a , b , sizeof(a))#define LL long long#define INF 100000000LL n;LL dp[70][10];void init(){    mem(dp , 0);    dp[0][0] = 1;    for(int i = 1 ; i <= 70 ; 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){    init();    int digit[70];    int pos = 0;    while(n)    {        digit[++pos] = n % 10;        n /= 10;    }    digit[pos+1] = 0;    LL ans = 0;    for(int i = pos ; i ; i--)    {        for(int j = 0 ; j < digit[i] ; j ++)        {            if(!(digit[i+1] == 4 && j == 9))                ans += dp[i][j];        }        if( (digit[i+1] == 4 && digit[i] == 9))            break;    }    return ans;}int main(){    int t;    scanf("%d" , &t);    while(t--)    {        scanf("%lld" , &n);        n++;        printf("%lld\n" , n-solve(n));    }    return 0;}


0 0
原创粉丝点击