HDU 1483 鑰匙計數之一 詳細過程

2021-06-26 10:43:50 字數 1434 閱讀 7917

hdu 1438  鑰匙計數之一

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: ...

又是一題遞推題,用遞推的思路去解。

說來慚愧,做這題的時候有個地方卡住了,直到看了別人的解題報告才豁然開朗(數學沒學好。。)

將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了,搜了題解才知道是遞迴。也算是個比較麻煩的遞迴了,分成兩個陣列關係,直接求難求,就轉化成總數,減去不符...