windy数 HYSBZ

来源:互联网 发布:互联网巨头反恐数据库 编辑:程序博客网 时间:2024/06/10 23:27

  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 。




又是一道数位dp,该题需要考虑前导0的情况。dfs传值:1.pos:当前位置。2.pre:前一位的数。3.sta:前面的数是否全为0。4.limit:前面的几位数是否都达到上限。


#include"stdio.h"#include"cstdio"#include"algorithm"#include"string.h"using namespace std;int dp[15][10][2],A[15];int dfs(int pos,int pre,int lead,int limit){if(pos<0)return 1;if(dp[pos][pre][lead]!=-1&&!limit)return dp[pos][pre][lead];int end=limit?A[pos]:9;int ans=0;for(int i=0;i<=end;i++){if(lead||abs(i-pre)>=2)ans+=dfs(pos-1,i,lead&&i==0,limit&&i==end);}if(!limit)dp[pos][pre][lead]=ans;return ans;}int solve(int x){int len=0;while(x){A[len++]=x%10;x/=10;}return dfs(len-1,0,1,1);}int main(){int a,b;while(scanf("%d%d",&a,&b)!=EOF){memset(dp,-1,sizeof(dp));int ret=solve(b)-solve(a-1);printf("%d\n",ret); }}


原创粉丝点击