题目描述
科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 123123123,446446446。现在大家决定玩一个游戏,指定一个整数闭区间 [a,b][a,b][a,b],问这个区间内有多少个不降数。
输入格式
有多组测试数据。每组只含两个数字 a,ba,ba,b,意义如题目描述。
输出格式
每行给出一个测试数据的答案,即 [a,b][a, b][a,b] 之间有多少不降数。
样例
样例输入
1 9
1 19
样例输出
9
18
数据范围与提示
对于全部数据,
解析:
裸得不能再裸的数位DP。
代码:
#include <bits/stdc++.h>
using namespace std;
const int Max=12;
int n,m,l,r,f[Max][Max][2];
char ch[Max];
inline int dfs(int pos,int pre,int limit)
{
if(pos==n+1) return 1;
if(~f[pos][pre][limit]) return f[pos][pre][limit];
int mx=limit?ch[pos]-'0':9,ans=0;
for(int i=0;i<=mx;i++) if(i>=pre) ans+=dfs(pos+1,i,limit&(i==mx));
return f[pos][pre][limit]=ans;
}
inline int solve(int num)
{
memset(f,-1,sizeof(f));
sprintf(ch+1,"%d",num),n=strlen(ch+1);
return dfs(1,0,1);
}
int main()
{
while(cin>>l>>r) cout<<solve(r)-solve(l-1)<<"\n";
return 0;
}