Windy数(数位dp)

来源:互联网 发布:2017网络暴力的新闻 编辑:程序博客网 时间:2024/06/01 19:55

Description

我定义了一种NO数。
不含前导零且相邻两个数位之差至少为2的正整数被称为NO数。
我想知道,在l和r之间,包括A和B,总共有多少个NO数?
特别的,1~9都是NO数

Format

Input

两个整数,l r(1<=l<=r<=2000000000)。

Output

一个整数,NO数的个数

Sample 1

Input

1 15

Output

12

Limitation

每个测试点1S,空间65536KB

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=20;int digit[maxn];ll dp[maxn][10];ll dfs(int pos,int pre,bool limit,bool zero){if(pos==0)return 1;if(dp[pos][pre]!=-1&&!limit&&!zero)return dp[pos][pre];ll ans=0;int up=limit?digit[pos]:9;for(int i=0;i<=up;i++)if( ( !zero&&abs(pre-i)>=2 ) ||zero)ans+=dfs(pos-1,i,limit&&i==up,zero&&i==0);if(!limit&&!zero)dp[pos][pre]=ans;return ans;}ll solve(ll x){int pos=1;while(x){digit[pos++]=x%10;x/=10;}return dfs(pos-1,0,1,1);}int main(){memset(dp,-1,sizeof(dp));ll l,r;while(scanf("%lld%lld",&l,&r)==2){printf("%lld\n",solve(r)-solve(l-1));}return 0;}




原创粉丝点击