windy定义了一种windy数。
不含前导零且相邻两个数字之差至少为 2 2的正整数被称为windy数。
windy想知道,在 A A和 B B之间,包括 A A和 B B,总共有多少个windy数?
包含两个整数, A A B B。
满足 1≤A≤B≤2000000000 1≤A≤B≤2000000000 .
Sample Input | Sample Output |
---|---|
1 10 |
9 |
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[22][22]; int bits[22]; int abs(int num) { if(num<0) num=-num; return num; } void init() { int i,j,k; for(i=0;i<10;i++) dp[1][i]=1; for(i=2;i<=12;i++) { for(j=0;j<10;j++) { for(k=0;k<10;k++) if(abs(j-k)>1) dp[i][j]+=dp[i-1][k]; } } } int work(int n) { int i,j,k,len=0; while(n) { bits[++len]=n%10; n/=10; } int ans=0; for(i=1;i<len;i++) { for(j=1;j<10;j++) ans+=dp[i][j]; } for(i=1;i<bits[len];i++) ans+=dp[len][i]; for(i=len-1;i;i--) { for(j=0;j<bits[i];j++) if(abs(bits[i+1]-j)>1) ans+=dp[i][j]; if(abs(bits[i+1]-bits[i])<2) break; } return ans; } int main() { int n,m; init(); while(cin>>n>>m) { // cout<<work(n)<<endl; cout<<work(m+1)-work(n)<<endl; } return 0; }