传送门: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 ",cal(r)-cal(l-1)); 71 } 72 return 0; 73 }