题解

xy0313 2020-09-30 9:13:29

数位DP模板题,不多赘述了

#include <iostream>

using namespace std;

const int N = 35;

int f[N][N];

void init()
{
	for(int i = 0;i <= 9;i ++) f[1][i] = 1;
	for(int i = 2;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 x)
{
	if(!x) return 1;
	int a[N] = {0};
	int l = 0;
	int ans = 0;
	int last = 0;
	while(x)
	{
		a[++ l]	= x % 10;
		x /= 10;
	}
	for(int i = l;i >= 1;i --)
	{
		for(int j = last;j < a[i];j ++)
			ans += f[i][j];
		if(last > a[i]) break;
		last = a[i];
		if(i == 1) ans ++;
	}
	return ans;
}

int main()
{
	init();
	int l,r;
	while(cin >> l >> r) cout << dp(r) - dp(l - 1) << endl;
	return 0;
}