HDU-3555 Bomb 数位DP

来源:互联网 发布:百视通网络电视怎么用 编辑:程序博客网 时间:2024/05/16 12:36

题目链接


#include <cstdlib>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 25;typedef unsigned __int64  Int64;Int64 N, dp[maxn][3];int digit[maxn];/*dp[len][0] 表示前len位没有49的数字的个数dp[len][1] 表示前len位没有49但是以9结尾的数的个数dp[len][2] 表示前len位有49的状态 */void init(){    dp[0][0] = 1;    for (int i = 1; i <= 20; ++i) {        dp[i][0] = 10 * dp[i-1][0] - dp[i-1][1];        dp[i][1] = dp[i-1][0];        dp[i][2] = 10 * dp[i-1][2] + dp[i-1][1];    }}int main(){#ifndef ONLINE_JUDGE    freopen("data.txt","r",stdin);#endif    init();    int cas, len, flag;    Int64 ret;    scanf("%d", &cas);    while( cas -- ){        flag = ret = 0;        scanf("%I64u", &N);        ++ N;        memset(digit, 0, sizeof (digit));        for( len = 1; N; len ++ ){            digit[len] = N % 10;            N /= 10;        }        for (int i = len-1; i >= 1; --i) {            ret += digit[i] * dp[i-1][2]; // 已经有49就直接加上             if ( flag ) {                ret += digit[i] * dp[i-1][0];            }            else if ( !flag && digit[i] > 4 ) {                ret += dp[i-1][1];                }            if (digit[i+1] == 4 && digit[i] == 9) {                flag = 1;            }        }        printf("%I64u\n", ret);    }    return 0;    }


#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<math.h>#include<functional>#include<algorithm>#include<vector>#include<queue>using namespace std;const int maxn = 20; typedef __int64 Int64;Int64 n;Int64 dp[maxn][3];int digit[maxn];Int64 dfs( int pos,int st,bool flag ){if( !pos ) return st == 2;if( flag && dp[pos][st] != -1 )return dp[pos][st];Int64 ans = 0;int u = flag?9:digit[pos];for( int i = 0; i <= u; i ++ ){if( st == 2 || ( st == 1 && i == 9 ) )ans += dfs( pos-1,2,flag||i<u );else if( i == 4 ) ans += dfs( pos-1,1,flag||i<u );else ans += dfs( pos-1,0,flag||i<u );}if( flag )dp[pos][st] = ans;return ans;}Int64 fun( Int64 x ){int len = 0;while( x ){digit[++len] = x%10;x /= 10;}return dfs( len,0,0 );}int main() {#ifndef ONLINE_JUDGE    freopen("data.txt","r",stdin);#endifint cas;scanf("%d",&cas);memset( dp,-1,sizeof(dp) );while( cas -- ){scanf("%I64d",&n);printf("%I64u\n",fun(n));}    return 0;}


0 0
原创粉丝点击