数字游戏

大佬用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 }

 

posted @ 2018-07-25 16:41  DJY_01  阅读(115)  评论(0编辑  收藏  举报