hdu5898 瀋陽網絡賽1007

原題
 
題意有點繞,odd-even數就是一個數  比方11222 就是,因爲連續奇數的長度爲2 而連續偶數的長度爲3,但是11222333不行,因爲3個3不滿足連續奇數爲偶數長度的條件。
數位DP,dp[len][pre][e] 代表第幾位,之前一位是奇數還是偶數,e表示是否還要添加一個與pre同爲奇數或者偶數的數。


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int dp[20][2][2];
int a[20];
long long int dfs(int len,int pre,int e,bool flag,bool s)
{
    if(len<0)
    {
        return e==1?0:1;
    }
    if(flag==false&&dp[len][pre][e]!=-1&&s)
    {
        return dp[len][pre][e];
    }
    long long int ans=0;
    int cnt=flag?a[len]:9;
    for(int i=0; i<=cnt; i++)
    {
        if(s==false)
        {
            if(i==0)
                ans+=dfs(len-1,0,0,flag&&i==cnt,false);
            else
            {
                ans+=dfs(len-1,i%2,i%2==1?1:0,flag&&i==cnt,true);
            }
        }
        else if(i%2==1)
        {
            if(pre%2==1)
                ans+= dfs(len-1,1,e^1,flag&&i==cnt,true);
            else
            {
                if(e==0)
                {
                    ans+= dfs(len-1,1,1,flag&&i==cnt,true);
                }
            }
        }
        else
        {
            if(pre%2==0)
                ans+=dfs(len-1,0,e^1,flag&&i==cnt,true);
            else
            {
                if(e==0)
                {
                    ans+=dfs(len-1,0,0,flag&&i==cnt,true);
                }
            }
        }
    }
    if(!flag&&s)
        dp[len][pre][e]=ans;
    return ans;
}
long long int solve(long long int x)
{
    int len=0;
    memset(a,0,sizeof(0));
    while(x>0)
    {
        a[len++]=x%10;
        x/=10;
    }
    return dfs(len-1,0,0,true,false);
}
int main()
{
    int t,ca=1;
    scanf("%d",&t);
    memset(dp,-1,sizeof(dp));
    while(t--)
    {
        long long int l,r;
        scanf("%I64d%I64d",&l,&r);
        printf("Case #%d: %I64d\n",ca++,solve(r)-solve(l-1));
    }
    return 0;
}
比賽的時候在OB 感謝隊友帶我飛
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章