Mountain Number FZU-2109数位dp

 1 #include<cstdio>
 2 int a[36],dp[36][10][2];//dp[i][j][k]第i数位的前一个数是j奇偶性是k的答案 
 3 int dfs(int p,int pre,bool jo,bool lim)
 4 {
 5     if(p<0)
 6         return 1;
 7     if(!lim&&dp[p][pre][jo]!=-1)
 8         return dp[p][pre][jo];
 9     int up=(lim ? a[p] : 9),ans=0;
10     for(int i=0;i<=up;i++)
11     {
12         if(!jo&&i<=pre)
13             ans+=dfs(p-1,i,1,lim&&i==a[p]);
14         else if(jo&&i>=pre)
15             ans+=dfs(p-1,i,0,lim&&i==a[p]);
16     }
17     if(!lim)
18         dp[p][pre][jo]=ans;
19     return ans;
20 }
21 int solve(int x)
22 {
23     int n=0;
24     while(x)
25     {
26         a[n++]=x%10;
27         x/=10;
28     }
29     return dfs(n-1,9,0,1);
30 }
31 int main()
32 {
33     int t,l,r;
34     for(int i=0;i<=32;i++)
35         for(int j=0;j<=9;j++)
36             for(int k=0;k<2;k++)
37                 dp[i][j][k]=-1;
38     scanf("%d",&t);
39     while(t--)
40     {
41         scanf("%d%d",&l,&r);
42         printf("%d\n",solve(r)-solve(l-1)); 
43     }
44     return 0;
45 }
View Code

 

posted @ 2019-05-03 16:55  新之守护者  阅读(121)  评论(0编辑  收藏  举报