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