[暑假集训--数位dp]UESTC250 windy数
Posted zhber
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[暑假集训--数位dp]UESTC250 windy数相关的知识,希望对你有一定的参考价值。
windy定义了一种windy数。
不含前导零且相邻两个数字之差至少为22 的正整数被称为windy数。
windy想知道,在AA 和BB 之间,包括AA 和BB ,总共有多少个windy数?
Input
包含两个整数,AA BB 。
满足 1≤A≤B≤20000000001≤A≤B≤2000000000 .
OutputSample Input
1 10
Sample Output
9
记一下上一位出现的数是啥
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<deque> 9 #include<set> 10 #include<map> 11 #include<ctime> 12 #define LL long long 13 #define inf 0x7ffffff 14 #define pa pair<int,int> 15 #define mkp(a,b) make_pair(a,b) 16 #define pi 3.1415926535897932384626433832795028841971 17 using namespace std; 18 inline LL read() 19 { 20 LL x=0,f=1;char ch=getchar(); 21 while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} 22 while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} 23 return x*f; 24 } 25 LL n,len,l,r; 26 LL f[20][11][2]; 27 int d[110]; 28 inline LL dfs(int now,int dat,int lead,int fp) 29 { 30 if (now==1)return !lead; 31 if (!fp&&f[now][dat][lead]!=-1)return f[now][dat][lead]; 32 LL ans=0,mx=fp?d[now-1]:9; 33 for (int i=0;i<=mx;i++) 34 { 35 if (!lead&&(i==dat-1||i==dat||i==dat+1))continue; 36 ans+=dfs(now-1,i,lead&&i==0&&now-1!=1,fp&&i==d[now-1]); 37 } 38 if (!fp)f[now][dat][lead]=ans; 39 return ans; 40 } 41 inline LL calc(LL x) 42 { 43 if (!x)return 1; 44 LL xxx=x; 45 len=0; 46 while (xxx) 47 { 48 d[++len]=xxx%10; 49 xxx/=10; 50 } 51 LL sum=0; 52 sum+=dfs(len,0,1,0); 53 for (int i=1;i<=d[len];i++) 54 sum+=dfs(len,i,0,i==d[len]); 55 return sum; 56 } 57 main() 58 { 59 while (~scanf("%lld%lld",&l,&r)) 60 { 61 memset(f,-1,sizeof(f)); 62 printf("%lld\n",calc(r)-calc(l-1)); 63 } 64 }
以上是关于[暑假集训--数位dp]UESTC250 windy数的主要内容,如果未能解决你的问题,请参考以下文章
[暑假集训--数位dp]LightOj1205 Palindromic Numbers
[暑假集训--数位dp]cf55D Beautiful numbers
[暑假集训--数位dp]LightOJ1140 How Many Zeroes?