[LibreOJ - 10164] 数字游戏
题目链接
大致题意:
统计区间内,不降数的个数
不降数:这种数字必须满足从左到右各位数字成小于等于的关系,如 123,446
解题思路:
我们只需要参数pre记录上一位的数字是多少
在搜索枚举过程中,将i<pre的情况跳过即可 (i当前位枚举的数字是多少)
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 30;
int a[N];
ll f[N][10];
ll dfs(int pos, int limit, int pre) {
if (!pos)return 1;
if (!limit && f[pos][pre] != -1)return f[pos][pre];
ll res = 0;
int end = limit ? a[pos] : 9;
for (int i = 0; i <= end; ++i) {
if (i < pre)continue;
res += dfs(pos - 1, limit && i == end, i);
}
if (!limit)f[pos][pre] = res;
return res;
}
ll dp(ll x) {
memset(f, -1, sizeof f);
int len = 0;
while (x) {
a[++len] = x % 10;
x /= 10;
}
return dfs(len, 1, 0);
}
int main(void)
{
ll l, r;
while (cin >> l >> r) {
cout << (dp(r) - dp(l - 1)) << endl;
}
return 0;
}