傳送門
描述
Windy 定義了一種 Windy 數:不含前導零且相鄰兩個數字之差至少爲 2 的正整數被稱爲 Windy 數。
Windy 想知道,在 A 和 B 之間,包括 A 和 B,總共有多少個 Windy 數?
輸入格式
共一行,包含兩個整數 A 和 B。
輸出格式
輸出一個整數,表示答案。
數據範圍
輸入樣例1:
1 10
輸出樣例1:
9
輸入樣例2:
25 50
輸出樣例2:
20
對於這道題是要求我們不能有相鄰兩位差值大於2的,所以我們遞歸的時候傳參就傳上一位的數字,然後還有種特殊情況就是前面全是0
這時候的第一位是沒有限制的,所以我們需要對這種情況標記一下,然後dp數組就要開三維,具體看代碼
#include<bits/stdc++.h>
using namespace std;
int digit[10],dp[32][12][2]; //第一維是數字長度,第二維是代表前一位是多少,第三維表示是否爲特殊情況
int dfs(int len,int pre,bool up,bool u) {
if(!len) return 1;
if(!up&&dp[len][pre][u]!=-1) return dp[len][pre][u];
int ret=0,upmax=up?digit[len]:9;
for(int i=0; i<=upmax; i++) {
if(abs(i-pre)<2&&!u) continue;
ret+=dfs(len-1,i,up&&upmax==i,i==0&&u);
}
return up?ret:dp[len][pre][u]=ret;
}
int count(int x) {
int len=0;
while(x) {
digit[++len]=x%10;
x/=10;
}
return dfs(len,0,true,true);
}
int main() {
int a,b;
memset(dp,-1,sizeof dp);
cin>>a>>b;
cout<<count(b)-count(a-1)<<'\n';
return 0;
}