题目描述
科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 ,。现在大家决定玩一个游戏,指定一个整数闭区间 ,问这个区间内有多少个不降数。
输入格式
有多组测试数据。每组只含两个数字 ,意义如题目描述。
输出格式
每行给出一个测试数据的答案,即 之间有多少不降数。
样例
样例输入
1 9
1 19
样例输出
9
18
一道简单的数位dp模板题
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 long long a[105],l,r,dp[105][15]; 7 int dfs(int pos,int l,bool flag) 8 { 9 if(pos==0) return 1; 10 if(!flag&&dp[pos][l]!=-1) return dp[pos][l]; 11 int tmp=0; 12 int t; 13 if(flag) t=a[pos]; 14 else t=9; 15 for(int i=l;i<=t;i++) tmp+=dfs(pos-1,i,flag&&i==t); 16 if(!flag) dp[pos][l]=tmp; 17 return tmp; 18 } 19 long long solve(int x) 20 { 21 int num=0; 22 while(x>0) 23 { 24 num++; 25 a[num]=x%10; 26 x/=10; 27 } 28 return dfs(num,0,true); 29 } 30 int main() 31 { 32 while(~scanf("%lld %lld",&l,&r)) 33 { 34 memset(dp,-1,sizeof(dp)); 35 printf("%lld\n",solve(r)-solve(l-1)); 36 } 37 }