Problem G: 等凹数字

传送门:http://gdutcode.sinaapp.com/problem.php?cid=1057&pid=6

解题思路:

还是不会,等两天在来看一下。

实现代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <queue>
 7 #include <time.h>
 8 #include <set>
 9 #include <map>
10 #include <string>
11 #include <math.h>
12 #include <stdlib.h>
13 using namespace std;
14 long long dp[20][20][10][2][2][2];
15 int num[20];
16 int s[20];
17 long long rec(int i,int pre,int up,int down,int flag,int q,int len,int ispa)
18 {
19     if(i<0)return up&&down&&ispa;
20     if(~dp[i][len][pre][up][down][ispa]&&!flag&&!q)return dp[i][len][pre][up][down][ispa];
21     long long res=0;
22     int o=s[i];
23     for(int j=0;j<10;j++)
24     {
25         num[i]=j;
26         if(j>o&&flag)break;
27         if(q)res+=rec(i-1,j,0,0,j<o?0:flag,q&&j==0,len-(q&&j==0),ispa);
28         else if(j==pre)
29         {
30             if(ispa&&i<len/2)
31             res+=rec(i-1,j,up,down,j<o?0:flag,q&&j==0,len,j==num[len-i-1]);
32             else res+=rec(i-1,j,up,down,j<o?0:flag,q&&j==0,len,ispa);
33         }
34         else if(j>pre)
35         {
36             if(!down)continue;
37             if(ispa&&i<len/2)
38             res+=rec(i-1,j,1,down,j<o?0:flag,q&&j==0,len,j==num[len-i-1]);
39             else res+=rec(i-1,j,1,down,j<o?0:flag,q&&j==0,len,ispa);
40         }
41         else if(j<pre)
42         {
43             if(up)continue;
44             if(ispa&&i<len/2)
45             res+=rec(i-1,j,up,1,j<o?0:flag,q&&j==0,len,j==num[len-i-1]);
46             else res+=rec(i-1,j,up,1,j<o?0:flag,q&&j==0,len,ispa);
47         }
48     }
49     if(!flag&&!q)dp[i][len][pre][up][down][ispa]=res;
50     return res;
51 }
52 long long cal(long long x)
53 {
54     int len=0;
55     while(x)
56     {
57         s[len++]=x%10;
58         x/=10;
59     }
60     return rec(len-1,0,0,0,1,1,len,1);
61 }
62 int main()
63 {
64     memset(dp,-1,sizeof(dp));
65     long long l,r;
66     int t;
67     scanf("%d",&t);
68     while(t--){
69     scanf("%lld%lld",&l,&r);
70     printf("%lld\n",cal(r)-cal(l-1));
71     }
72     return 0;
73 }

 

posted on 2017-03-28 19:40  mkfoy  阅读(755)  评论(1编辑  收藏  举报

导航