分析
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N = 15;
int f[N][N];
void init()
{
for(int i = 0; i <= 9; ++i)f[1][i] = 1;
for(int i = 1; i <= N; ++i)
for(int j = 0; j <= 9; ++j)
for(int k = j; k <= 9; ++k)
f[i][j] += f[i - 1][k];
}
int dp(int n)
{
if(!n) return 1;
//计算从1 ~ n的不降数的集合
vector<int> num;
while(n)num.push_back(n % 10), n /= 10;
int last = 0, res = 0;
//枚举每一位
for(int i = num.size() - 1; i >= 0; i--)
{
//计算左边的分支
int x = num[i];
for(int j = last; j < x; ++j)
res += f[i + 1][j];
//特判一下: 如果当前数比前一个数小,不能进入右边的分支
if(x < last) break;
//进入右边的分支
last = x;
//最后再加上最右边末端的分支
if(!i)res++;
}
return res;
}
int main()
{
init();
int l, r;
while(cin >> l >> r)
{
cout << dp(r) - dp(l - 1) << endl;
}
return 0;
}