1082. 數字遊戲(數位dp)

傳送門

描述

科協裏最近很流行數字遊戲。

某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。

現在大家決定玩一個遊戲,指定一個整數閉區間 [a,b],問這個區間內有多少個不降數。

輸入格式

輸入包含多組測試數據。

每組數據佔一行,包含兩個整數 a 和 b。

輸出格式

每行給出一組測試數據的答案,即 [a,b] 之間有多少不降數。

數據範圍

1ab23111≤a≤b≤231−1

輸入樣例:

1 9
1 19

輸出樣例:

9
18

我們記錄狀態的時候只要記錄前面是否達到上限和前面一個數字是多少以及當前跑到第幾位就行,不滿足條件的continue即可

AC代碼如下:
#include <iostream>
#include <cstring>
using namespace std;
int dp[32][10], digit[32], len;
int dfs(int pos, int pre, bool up) {
	if(!pos)	return 1;
	if(!up&&dp[pos][pre]!=-1)	return dp[pos][pre];
	int ret=0,upmax=up?digit[pos]:9;
	for(int i=0; i<=upmax; i++) {
		if(i<pre)continue;
		ret+=dfs(pos-1,i,up&&i==upmax);
	}
	if(!up)return dp[pos][pre]=ret;
	return ret;
}
int solve(int x) {
	len = 0;
	memset(dp, -1, sizeof(dp));
	while (x) {
		digit[++len] = x % 10;
		x /= 10;
	}
	return dfs(len, 0, true);
}
int main() {
	int a, b;
	while (cin >> a >> b) {
		cout << solve(b) - solve(a-1) << endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章