HDU 5898 odd-even number (数位DP)

来源:互联网 发布:王鸥为什么被黑 知乎 编辑:程序博客网 时间:2024/05/11 15:10

题意:

求l~r 连续的奇数个数有偶数个,连续偶数的个数有奇数个 的 数字个数


#include <map>#include <set>#include <queue>#include <cmath>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;ll dp[20][5];int digit[20];/// 0 前导0/// 1 奇数的个数有奇数个/// 2 奇数的个数有偶数个/// 3 偶数的个数有奇数个/// 4 偶数的个数有偶数个ll dfs(int len,int limit,int status){    if(len<0)    {        if(status==2||status==3)            return 1;        return 0;    }    if(!limit&&dp[len][status]!=-1)        return dp[len][status];    int last;    if(limit) last=digit[len];    else last=9;    ll ans=0;    for(int i=0;i<=last;i++)    {        if(status==0)        {            if(i==0) ans+=dfs(len-1,0,0);            else            {                if(i&1)                    ans+=dfs(len-1,limit&&i==last,1);                else                    ans+=dfs(len-1,limit&&i==last,3);            }        }        else if(status==1)        {            if(i%2)                ans+=dfs(len-1,limit&&i==last,2);        }        else if(status==2)        {            if(i%2==0)                ans+=dfs(len-1,limit&&i==last,3);            else ans+=dfs(len-1,limit&&i==last,1);        }        else if(status==3)        {            if(i%2==0)                ans+=dfs(len-1,limit&&i==last,4);            else ans+=dfs(len-1,limit&&i==last,1);        }        else if(status==4)        {            if(i%2==0) ans+=dfs(len-1,limit&&i==last,3);        }    }    if(!limit)        dp[len][status] = ans;    return ans;}ll solve(ll x){    memset(dp,-1,sizeof(dp));    int cnt=0;    while(x!=0)    {        digit[cnt++]=x%10;        x/=10;    }    return dfs( cnt-1, 1, 0 ) ;}int main(){    int t;    scanf("%d",&t);    for(int cs=1;cs<=t;cs++)    {        ll l,r;        scanf("%lld%lld",&l,&r);        printf("Case #%d: ",cs);        printf("%lld\n",solve(r)-solve(l-1));    }}


原创粉丝点击