思想很简单,但是由于在这道题上犯二,此题让我改到吐血,代码能力还是很差。
题意:
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
只需要预处理出第I位最高位为j的windy数是多少,然后去计算就行了,但是注意迁到不能为零。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn=0x3f3f3f3f;
int dp[15][12],num[15];
void anticipation(){
memset(dp,0,sizeof(dp));
for(int i=0;i<10;i++)
dp[1][i]=1;
for(int i=2;i<=10;i++)
for(int j=0;j<10;j++)
for(int k=0;k<10;k++)
if(abs(j-k)>1)
dp[i][j]+=dp[i-1][k];
}
int solve(int x){
int len=1,ans=0;
while(x){
num[len++]=x%10;
x/=10;
}
--len;
for(int i=len-1;i>=1;i--)
for(int j=1;j<10;j++)
ans+=dp[i][j];
for(int i=num[len]-1;i>=1;i--)
ans+=dp[len][i];
for(int i=len-1;i>0;i--){
for(int j=num[i]-1;j>=0;j--)
if(abs(num[i+1]-j)>1)
ans+=dp[i][j];
if(abs(num[i+1]-num[i])<2)
break;
}
return ans;
}
int main(){
int x,y;
anticipation();
while(scanf("%d%d",&x,&y)==2){
printf("%d\n",solve(y+1)-solve(x));
}
return 0;
}