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[][];
int bit[];
int dfs(int len,int num,int z,bool fp)//当前到了那一位,当前位是num,当前处理的是不是第一位 ,是不是受限制
{
if(len<)
return ;
if(z&&!fp&&dp[len][num]!=-)
return dp[len][num];
int cur=;
int fmax=fp?bit[len]:;
for(int i=;i<=fmax;i++)
{
if(!z)//是第一位(就不用考虑是不是和上一位的差是2了)
cur+=dfs(len-,i,i,fp&&i==fmax);
else//不是第一位(正常运算)
{
if(abs(num-i)>=)
cur+=dfs(len-,i,,fp&&i==fmax);
}
//cout<<cur<<endl;
}
if(!fp&&z)
dp[len][num]=cur;
return cur;
}
int solve(int n)
{
int len=;
while(n)
{
bit[++len]=n%;
n/=;
}
//cout<<"len="<<len<<endl;
//for(int i=len;i>=1;i--)
// cout<<bit[i];
//cout<<endl;
//if(len==1)
// return n;
return dfs(len,,,true);
}
int main()
{
//freopen("in.txt","r",stdin);
int t;
memset(dp,-,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\n",solve(r)-solve(l-));
return ;
}
上一篇:跟着百度学PHP[14]-COOKIE的应用/网站登陆案例完整案例


下一篇:Go Example--通道方向