windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
包含两个整数,A B。
一个整数
【输入样例一】 1 10 【输入样例二】 25 50
【输出样例一】 9 【输出样例二】 20
题目大概:
找出两个数字之间,不含前导零且相邻两个数字只差至少为2的整数的个数。
思路:
基础数位dp 加上前导零,多加一个状态;
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
int a[30];
int dp[30][20];
int sove(int pos,int qian,int limit,int ll)
{
if(pos==-1)return !ll;
if(!limit&&dp[pos][qian]!=-1&&!ll)return dp[pos][qian];
int sum=0;
int end=limit?a[pos]:9;
for(int i=0;i<=end;i++)
{ int gg=fabs(qian-i);
if(ll)sum+=sove(pos-1,i,limit&&(i==a[pos]),ll&&i==0);
else if(gg>=2)sum+=sove(pos-1,i,limit&&(i==a[pos]),ll);
}
if(!limit&&!ll)dp[pos][qian]=sum;
return sum;
}
int go(int x)
{
int pos=0;
while(x)
{
a[pos++]=x%10;
x/=10;
}
return sove(pos-1,0,1,1);
}
int main()
{
int m,n;
memset(dp,-1,sizeof(dp));
scanf("%d%d",&m,&n);
printf("%d\n",go(n)-go(m-1));
return 0;
}