1026: [SCOI2009]windy数
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
Sample Input
【输入样例一】
1 10
【输入样例二】
25 50
1 10
【输入样例二】
25 50
Sample Output
【输出样例一】
9
【输出样例二】
20
9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
这是一道比较显然的数位DP吧。。
f[i][j]表示第j位的数是i
那么转移方程就比较好想了
f[i][j]+=f[k][j-1](0<k<i-2||i+2<k<9)
然后就可以做了。。
然后最后再统记b的和-(a-1)的和即可。。。
统计的时候,先求比x少一位的数字的总和,再求在最高位比x小的,最后求最高位是x的。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdlib> 3 #include<cmath> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<string> 8 #include<map> 9 #include<queue> 10 #include<vector> 11 #include<set> 12 #define inf 1000000000 13 #define maxn 10000+5 14 #define maxm 10000+5 15 #define eps 1e-10 16 #define ll long long 17 #define for0(i,n) for(int i=0;i<=(n);i++) 18 #define for1(i,n) for(int i=1;i<=(n);i++) 19 #define for2(i,x,y) for(int i=(x);i<=(y);i++) 20 #define for3(i,x,y) for(int i=(x);i>=(y);i--) 21 #define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go) 22 using namespace std; 23 int read(){ 24 int x=0,f=1;char ch=getchar(); 25 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 26 while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int f[10][10],b[20]; 30 int calc(int x){ 31 if(x==0)return 0; 32 int ans=0,len=0,flag=1; 33 while(x){ 34 b[++len]=x%10; 35 x/=10; 36 } 37 for1(i,len-1) 38 for1(j,9) 39 ans+=f[j][i]; 40 for1(i,b[len]-1)ans+=f[i][len]; 41 for(int i=len-1;i;i--){ 42 for0(j,b[i]-1) 43 if(abs(b[i+1]-j)>=2)ans+=f[j][i]; 44 if(abs(b[i+1]-b[i])<2){ 45 flag=0; 46 break; 47 } 48 } 49 if(flag==1)ans++; 50 return ans; 51 } 52 int main(){ 53 //freopen("input.txt","r",stdin); 54 //freopen("output.txt","w",stdout); 55 for0(i,9)f[i][1]=1; 56 int a=read(),b=read(); 57 for0(i,10) 58 for(int k=0;k<10;k++){ 59 for(int j=0;j<=k-2;j++)f[k][i]+=f[j][i-1]; 60 for(int j=k+2;j<=9;j++)f[k][i]+=f[j][i-1]; 61 } 62 printf("%d",calc(b)-calc(a-1)); 63 return 0; 64 }