Palindromic Numbers LightOJ - 1205

Palindromic Numbers LightOJ - 1205

http://blog.csdn.net/harlow_cheng/article/details/77466732

话说原来记忆化搜索还能回溯...很少见啊,这里回溯实际作用是省去了用别的东西来表示之前选的数字的状态。

注意点:

1.必须要对不同的tot(总长度)记忆化到不同的数组中

2.19行

 1 #include<cstdio>
 2 #include<cstring>
 3 typedef long long LL;
 4 LL ans[30][30][2];
 5 LL w[30];
 6 LL T,l,r;
 7 LL temp[30];
 8 LL dp(LL tot,LL pos,bool pre0,bool limit)
 9 {
10     if(pos<1)    return 1;
11     if(!limit&&ans[tot][pos][pre0]!=-1)
12         return ans[tot][pos][pre0];
13     LL i,res=0,end=limit?w[pos]:9;
14     for(i=0;i<=end;i++)
15     {
16         temp[pos]=i;
17         if(i==0&&pre0)
18             res+=dp(tot-1,pos-1,1,0);
19             //res+=dp(tot,pos-1,1,0);这样会错
20         else if(pos>tot/2)//5-->5,4,3 6-->6,5,4 如果在前一半则可以随便填
21             res+=dp(tot,pos-1,0,limit&&i==w[pos]);
22         else if(temp[pos]==temp[tot-pos+1])//如果在后一半就必须和前一半一样
23             res+=dp(tot,pos-1,0,limit&&i==w[pos]);
24     }
25     if(!limit)    ans[tot][pos][pre0]=res;
26     return res;
27 }
28 LL get(LL x)
29 {
30     if(x<0)    return 0;
31     LL len=0;
32     for(;x>0;x/=10)    w[++len]=x%10;
33     return dp(len,len,1,1);
34 }
35 int main()
36 {
37     LL iii,ttt;
38     memset(ans,-1,sizeof(ans));
39     scanf("%lld",&T);
40     for(iii=1;iii<=T;iii++)
41     {
42         scanf("%lld%lld",&l,&r);
43         if(l>r)    ttt=l,l=r,r=ttt;
44         printf("Case %lld: %lld\n",iii,get(r)-get(l-1));
45     }
46     return 0;
47 }
posted @ 2017-10-06 11:50  hehe_54321  阅读(251)  评论(0编辑  收藏  举报
AmazingCounters.com