LOJ #10164. 「一本通 5.3 例 2」数字游戏

题目描述

科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如123,446 。现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数。

输入格式

有多组测试数据。每组只含两个数字a,b,意义如题目描述。

输出格式

每行给出一个测试数据的答案,即[a,b]之间有多少不降数。

样例

样例输入

1 9
1 19

样例输出

9
18

数据范围与提示

对于全部数据,1≤a≤b≤2^31-1


思路

数位DP入门题

 

代码:

#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int a,b;
int f[20][20];

vector<int> d;

int dfs(int pos,int sta,int don) {
	if(pos==-1)
		return 1;
	if(!don&&~f[pos][sta])
		return f[pos][sta];
	int res=0;
	int end=don?d[pos]:9;
	for(int i=sta; i<=end; i++)
		res+=dfs(pos-1,i,don&&i==end);
	if(!don)
		f[pos][sta]=res;
	return res;
}

long long solve(int num) {
	memset(f,-1,sizeof(f));
	d.clear();
	while(num>0) {
		d.push_back(num%10);
		num/=10;
	}
	return dfs(d.size()-1,0,1);
}

int main() {
	while(~scanf("%d%d",&a,&b))
		printf("%lld\n",solve(b)-solve(a-1));
	return 0;
}

 

posted @ 2019-07-25 17:32  双子最可爱啦  阅读(389)  评论(0)    收藏  举报