HDU 2089 数位DP

来源:互联网 发布:oceanbase数据库文档 编辑:程序博客网 时间:2024/04/26 20:35

点击打开链接

题意:中文题

思路:另外一道数位DP模版题

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const ll INF=0x3f3f3f3f3f3f3f3fll;const int maxn=5010;int dig[20];ll dp[20][10];ll dfs(int pos,int pre,int lim){    if(pos<0) return 1;    if(!lim&&dp[pos][pre]!=-1) return dp[pos][pre];    int las=lim?dig[pos]:9;    ll ret=0;    for(int i=0;i<=las;i++){        if(i==4||pre==6&&i==2) continue;        ret+=dfs(pos-1,i,lim&&(i==las));    }    if(!lim) dp[pos][pre]=ret;    return ret;}ll slove(ll n){    int len=0;    while(n){        dig[len++]=n%10;        n/=10;    }    return dfs(len-1,0,1);}int main(){    memset(dp,-1,sizeof(dp));    ll n,m;    while(scanf("%I64d%I64d",&n,&m)!=-1){        if(n==0&&m==0) break;        printf("%I64d\n",slove(m)-slove(n-1));    }    return 0;}

0 0