钥匙计数之一
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成为钥匙。
仔细思考一下,刚刚举过的例子在这里是被减去了的。