hdu 1438 鑰匙計數之一
problem description
一把鎖匙有n個槽,槽深為1,2,3,4。每鎖匙至少有3個不同的深度且至少有1對相連的槽其深度之差為3。求這樣的鎖匙的總數。
input
本題無輸入
output
對n>=2且n<=31,輸出滿足要求的鎖匙的總數。
sample output
n=2: 0n=3: 8
n=4: 64
n=5: 360
....
....
....
..n=31: ...
又是一題遞推題,用遞推的思路去解。
說來慚愧,做這題的時候有個地方卡住了,直到看了別人的解題報告才豁然開朗(數學沒學好。。)
將lock[n]計做n個凹槽時,符合要求的鑰匙總數.
將one[n]計做n個凹槽時,第n個凹槽為1時符合要求的鑰匙總數.
將two[n]計做n個凹槽時,第n個凹槽為2時符合要求的鑰匙總數.
且1=4,2=3;
對與第n個凹槽,有兩種情況。
1.前n-1個凹槽以構成鑰匙,那麼對於第n個凹槽而言,無論第n個凹槽為1/2/3/4,都有lock[n-1]種情況。
2.前n-1個凹槽未構成鑰匙,加了第n個凹槽後才符合鑰匙規則,那麼分兩種情況
a.當第n個凹槽為 2/3時,前面n-1個凹槽必須為1/4構造而成的,出去兩種全為1/4的情況,即2^(n-1)-2種情況
b.當第n個凹槽為1/4時,前面n-1個凹槽的構成有多種情況,將這多種情況分析清楚:
假設第n個凹槽為1:
則前面n-1個凹槽的構成情況有如下幾種
由已知條件「前n-1個凹槽未構成鑰匙,加了第n個凹槽後才符合鑰匙規則」
可以將a2,b2,c2,d的全部情況排除,推得結論n-1個凹槽上必須為4,才符合已知條件。
即:a1+b1+c1=all-(a2+b2+c2+d)=1*4^(n-2)-(one[n-1]+1*2^(n-2)-1+1)
綜合以上兩種情況:
one[n]=4^(n-2)-(one[n-1]+2^(n-2))+lock[n-1]
two[n]=2^(n-1)-2+lock[n-1]
lock[n]=2*(one[n]+two[n])
**如下:
#include#includeint main()
,two[32]=,lock[32]=;
one[3]=2;
lock[2]=0;
lock[3]=8;
printf("n=2: 0\n");
printf("n=3: 8\n");
for(int n=4;n<32;n++)
getchar();
return 1;
}
hdu 1438 鑰匙計數之一
題意 略 題解 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 分析 若x是鑰匙,則x加1,2,3,4.都是鑰匙則a i a i 1 4 若x不是鑰匙,加...
hdu 1438 鑰匙計數之一
problem acm.hdu.edu.cn showproblem.php?pid 1438 reference blog.csdn.net u010405898 article details 9530769 blog.csdn.net zoucharming article details 4...
遞推 鑰匙計數之一
題目位址 題目大意 一把鎖匙有n個槽,槽深為1,2,3,4。每鎖匙至少有3個不同的深度且至少有1對相連的槽其深度之差為3。求這樣的鎖匙的總數。思路 這個題本來是在狀壓dp專項裡遇到的,光想狀壓dp了,搜了題解才知道是遞迴。也算是個比較麻煩的遞迴了,分成兩個陣列關係,直接求難求,就轉化成總數,減去不符...