windy数(数位DP)

windy数Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:165888KB     64bit IO Format:%lld & %llu

Submit Status

Description

 

Input

 

Output

 

Sample Input

 

Sample Output

 

Hint

 

Description

  windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?

Input

  包含两个整数,A B。

Output

  一个整数

Sample Input

【输入样例一】
1 10
【输入样例二】
25 50

Sample Output

【输出样例一】
9
【输出样例二】
20

Hint

【数据规模和约定】

100%的数据,满足 1 <= A <= B <= 2000000000 。

/*
题解用的递推,自己用DFS枚举一遍过了,成就感^0^
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#define mod 2520
using namespace std;
int l,r;
int dp[20][10];
int bit[20];
int dfs(int len,int num,int z,bool fp)//当前到了那一位,当前位是num,当前处理的是不是第一位 ,是不是受限制
{
    if(len<1)
        return 1;
    if(z&&!fp&&dp[len][num]!=-1)
        return dp[len][num];
    int cur=0;
    int fmax=fp?bit[len]:9;
    for(int i=0;i<=fmax;i++)
    {
        if(!z)//是第一位(就不用考虑是不是和上一位的差是2了)
            cur+=dfs(len-1,i,i,fp&&i==fmax);
        else//不是第一位(正常运算)
        {
            if(abs(num-i)>=2)
                cur+=dfs(len-1,i,1,fp&&i==fmax);
        }
        //cout<<cur<<endl;
    }    
    if(!fp&&z)
        dp[len][num]=cur;
    return cur;
}
int solve(int n)
{
    int len=0;
    while(n)
    {
        bit[++len]=n%10;
        n/=10;
    }
    //cout<<"len="<<len<<endl;
    //for(int i=len;i>=1;i--)
    //    cout<<bit[i];
    //cout<<endl;
    //if(len==1)
    //    return n;
    return dfs(len,0,0,true);
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    memset(dp,-1,sizeof dp);
    //cout<<"solve(10)="<<solve(10)<<endl;
    //cout<<"solve(24)="<<solve(24)<<endl;
    //cout<<"solve(25)="<<solve(25)<<endl;
    //cout<<"solve(50)="<<solve(50)<<endl;
    while(scanf("%d%d",&l,&r)!=EOF)
        printf("%d
",solve(r)-solve(l-1));
    return 0;
}
原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5765052.html