HDU5898 数位DP

来源:互联网 发布:网络广告费价格 编辑:程序博客网 时间:2024/05/18 00:58

套的模板   其实数位DP很简单  就是深搜的过程中DP

#include <bits/stdc++.h>using namespace std;long long dp[25][25][25];int bit[25];long long dfs(int pos,int pre,int len,int limit){    if(pos <= 0) return (len&1) != (pre&1);    if(!limit && dp[pos][pre][len] != -1) return dp[pos][pre][len];    int d = limit ? bit[pos] : 9;    long long sum = 0;    for(int i=0;i<=d;i++){        if(!len && !i){            sum += dfs(pos-1,1,0,limit && i == d);        }        else if(pre & 1){            if(!(i & 1) && len & 1) continue;            sum += dfs(pos-1,i,i & 1 ? len+1 : 1,limit && i == d);        }        else{            if(i & 1 && !(len & 1)) continue;            sum += dfs(pos-1,i,i & 1 ? 1 : len+1,limit && i == d);        }    }    if(!limit) dp[pos][pre][len] = sum;    return sum;}long long slove(long long n){    int len = 0;    while(n){        bit[++len] = n%10;        n /= 10;    }    return dfs(len,1,0,true);}int main(){    ios::sync_with_stdio(false);    int T,cnt=0;    cin>>T;    while(T--){        memset(dp,-1,sizeof(dp));        long long l,r;        cin>>l>>r;        cout<< "Case #"<<++cnt<<": ";        cout<< slove(r) - slove(l-1) <<endl;    }    return 0;}

1 0