数字游戏
大佬用DP,蒟蒻用DFS......
我们发现我们只要找到n以前的不降数,m以前的不降数,再一减就是n—m的不降数......去分解m,n的每一位数,代码:
1 #include<bits/stdc++.h> 2 #define LL long long 3 using namespace std; 4 LL ji_lu[11000]; 5 LL dp[1100][1100]={0}; 6 LL zhao(LL x,LL l,LL r) 7 { 8 LL k=0; 9 LL h=0; 10 LL sum=0; 11 if(x==-1) return 1; 12 while(!r&&dp[x][l]!=0)//找到了值 13 { 14 return dp[x][l]; 15 } 16 if(r) h=ji_lu[x];//找每一位的数 17 else h=9;//每一位的书最大就是9 18 for(LL i=l;i<=h;i++)//从l开始枚举 19 { 20 sum+=zhao(x-1,i,r&i==h); 21 /* 22 一定要写r&i==h因为要判断r安位与i是否等于h。 23 */ 24 } 25 if(!r) dp[x][l]=sum; 26 return sum;//反回值 27 } 28 LL fen_jie_zhao(LL n) 29 { 30 LL k=0; 31 while(n)//分解 32 { 33 ji_lu[k++]=n%10; 34 n/=10; 35 } 36 return zhao(k-1,0,1);//去找 37 } 38 int main() 39 { 40 LL n,m; 41 while(scanf("%d%d",&n,&m)==2)//读入 42 { 43 LL sum1=fen_jie_zhao(m); 44 LL sum2=fen_jie_zhao(n-1); 45 cout<<sum1-sum2<<endl;//输出 46 } 47 }