您的位置:首页 > 其它

hdu 3555 Bomb 【数位DP】

2016-09-19 19:56 267 查看
题意  出现 49的个数

#pragma comment(linker, "/STACK:102400000,102400000") 

#include <algorithm>

#include <iostream>

#include <iomanip>

#include <sstream>

#include <cstring>

#include <cstdio>

#include <string>

#include <vector>

#include <bitset>

#include <queue>

#include <stack>

#include <cmath>

#include <ctime>

#include <list>

#include <set>

#include <map>

#include <queue>

#define Pi acos(-1.0)

using namespace std;

typedef __int64 ll;

ll DP[20][10];

int DIG[20];

ll  dfs(int pos,int pre,int limit)

{

    if(pos < 0)

        return   1;

    

    if(!limit && DP[pos][pre] != -1)

        return    DP[pos][pre];

    int    end = limit ? DIG[pos] : 9;

    ll    ret = 0;

    

    for(int i = 0;i <= end;i ++){

    if(pre==4 && i ==9 ) continue;
ret += dfs(pos - 1,i,limit && (i == end));

    }

        

    //DP里保存完整的、取到尽头的数据

    if(!limit)

        DP[pos][pre]= ret;

    return    ret;

}

ll slove(ll x){
ll tem = x;
memset(DP,-1,sizeof DP);
int num = 0;
while(x){
DIG[num] = x%10;
x/=10;
num++;
}
ll ans = 0;
ans = dfs(num-1,0,1);
ans = tem - ans + 1;
return ans;

}

int main(){
ll m;
int t;
scanf("%d", &t);
while(t--){
scanf("%lld", &m);
printf("%lld\n", slove(m));


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp