1083. Windy數 (數位dp)

傳送門

描述

Windy 定義了一種 Windy 數:不含前導零且相鄰兩個數字之差至少爲 2 的正整數被稱爲 Windy 數。

Windy 想知道,在 A 和 B 之間,包括 A 和 B,總共有多少個 Windy 數?

輸入格式

共一行,包含兩個整數 A 和 B。

輸出格式

輸出一個整數,表示答案。

數據範圍

1AB2×1091≤A≤B≤2×109

輸入樣例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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章