HDU 2089 数位DP

来源:互联网 发布:dialog数据库 编辑:程序博客网 时间:2024/04/20 20:22

状态转移方程

dp[i][0]=dp[i-1][0]*9-dp[i-1][1];                            //不含62和4 
dp[i][1]=dp[i-1][0];                                               //不含62和4,但2结尾 

dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];         //含62和4

#include <cstdlib>#include <cctype>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <iostream>#include <sstream>#include <map>#include <set>#include <queue>#include <stack>#include <fstream>#include <numeric>#include <iomanip>#include <bitset>#include <list>#include <stdexcept>#include <functional>#include <utility>#include <ctime>#include <cassert>#include <complex>using namespace std;typedef long long ll;typedef long double ld;const int int_max = 0x07777777;const int int_min = 0x80000000;const int inf=0x20202020;const ll mod=1000000007;const double eps=1e-9;const double pi=3.1415926535897932384626;const int DX[]={1,0,-1,0},DY[]={0,1,0,-1};ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}ll powmod(ll a,ll b,ll mod) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}int n,m;int dp[10][3];int a[10];int solve(int len){    int sum = 0;    int last=0,flag=0;    for(int i = len; i >= 1; i--){        sum += a[i]*dp[i-1][2];        if(flag){            sum += a[i]*dp[i-1][0];        }        if(!flag&&a[i]>6) sum += dp[i-1][1];        if(!flag&&last==6&&a[i]>2) sum += dp[i][1];        if(!flag&&a[i]>4) sum += dp[i-1][0];        if((last==6&&a[i]==2) || a[i]==4) flag = 1;        last = a[i];    }    return sum;}int main(){    memset(dp,0,sizeof(dp));    dp[0][0] = 1;    for(int i = 1; i < 10; i++){        dp[i][0] = 9*dp[i-1][0]-dp[i-1][1];        dp[i][1] = dp[i-1][0];        dp[i][2] = dp[i-1][0]+dp[i-1][1]+dp[i-1][2]*10;    }    while(scanf("%d %d", &n, &m)!=EOF){        if(n==0 && m==0) break;        int t = m-n+1;                //n = n-1;        memset(a,0,sizeof(a));        int len = 0;        while(n){            a[++len] = n%10;            n /= 10;        }        //a[len+1] = 0;        int ret1 = solve(len);        memset(a,0,sizeof(a));        len = 0;        m++;        while(m){            a[++len] = m%10;            m /= 10;        }        //a[len+1] = 0;        int ret2 = solve(len);        printf("%d\n",t-(ret2-ret1));    }}


0 0