hdu1438——钥匙计数

钥匙计数之一

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2136    Accepted Submission(s): 1018

Problem Description
一把锁匙有N个槽,槽深为1,2,3,4。每锁匙至少有3个不同的深度且至少有1对相连的槽其深度之差为3。求这样的锁匙的总数。
 
Input
本题无输入
 
Output
对N>=2且N<=31,输出满足要求的锁匙的总数。
 
Sample Output
N=2: 0 N=3: 8 N=4: 64 N=5: 360 .. .. .. .. .. .. .. N=31: ... 注:根据Pku Judge Online 1351 Number of Locks或 Xi'an 2002 改编,在那里N<=16
 
Author
ecjtu_zhousc
 
题目链接:
 
 
解题思路:
 
一道经典的递归思路题。
 
1.在填入i槽孔前已经是钥匙,那么第i位无论是哪个深度的槽孔都是钥匙。
2.在填入i槽孔前不是钥匙。
  (1)i槽孔填入2/3成为钥匙,那么之前i-1个槽孔由1/4组成并且不为仅有1或者仅有4.
  (2)i槽孔填入1/4成为钥匙,那么第i-1槽孔为4/1。
 
那么我们将这些加起来是不是就是答案呢?清楚这样一个思路后,我们就要进行计算。
 
a[i]+=a[i-1]*4;//填入槽孔前已经是钥匙
a[i]+=[2^(i-1)-2]*2;//填入2/3成为钥匙
temp=[4^(i-2)-2^(i-2)]*2-b[i-1];//填入1/4成为钥匙
a[i]+=temp;
b[i]=a[i-1]*2+temp;
 
可能你会有这样的想法:在计算temp时4^(i-2),因为是4个数字随机,会出现例如这样的情况:
i=8。当前i-1为2314231,而现在该填入第i位4。而在填入前,i=7时已经是钥匙了。
temp计算时会减去b[i-1],b[i-1]=a[i-2]*2+填入1/4成为钥匙。
仔细思考一下,刚刚举过的例子在这里是被减去了的。
原文地址:https://www.cnblogs.com/noback-go/p/11138028.html