Problem 1160 - 科协的数字游戏I
Time Limit: 1000MS Memory Limit: 65536KB Difficulty: Total Submit: 184 Accepted: 32 Special Judge: No
Description
科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成大于等于的关系,如123,446。现在大家决定玩一个游戏,指定一个整数闭区间[a,b],问这个区间内有多少个不降数。
Input
题目有多组测试数据。每组只含2个数字a, b (1 <= a, b <= 2^31)。
Output
每行给出一个测试数据的答案,即[a, b]之间有多少阶梯数。
Sample Input
1 9 1 19
Sample Output
9 18
Hint
Source
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int a,b,dp[20][20],bit[20];int dfs(int pos,int s,bool limit){ if(pos==-1) return 1; if(!limit&&~dp[pos][s]) return dp[pos][s]; int end=limit?bit[pos]:9; int ans=0; for(int i=s;i<=end;i++) ans+=dfs(pos-1,i,limit&&(i==end)); if(!limit) dp[pos][s]=ans; return ans;}int main(){ memset(dp,-1,sizeof(dp)); while(scanf("%d%d",&a,&b)!=EOF) { int len=0; a--; while(a) { bit[len++]=a%10; a/=10; } int A=dfs(len-1,0,true); len=0; while(b) { bit[len++]=b%10; b/=10; } int B=dfs(len-1,0,true); printf("%d\n",B-A); } return 0;} |