hdu 1480 鑰匙計數之二

2021-05-28 10:05:27 字數 1615 閱讀 7296

problem description

一把鑰匙有n個槽,2input

本題無輸入

output

對2sample output

n=3: 104

n=4: 904

n=5: 5880..

.n=25: 8310566473196300280

提交完本題後,頗覺有遞推的味道。

出發點:構造結果ans[n]=num[1]+……+num[6];其中num[i]表示以i為最後乙個槽的高度;計算出num[i],從而得出結果。

首先進行初始化分析,即n=3時。

「相連的槽其深度之差不得為5」——1,6這兩個高度不能相鄰;而2,3,4,5這四個高度等價,且之後n=4,5,……25的計算過程中均有此規律。即num[1]=num[6],num[2]=num[3]=num[4]=num[5],在寫**時注意到這點便可以不需要用到陣列;

num[1]=num[6]=16;num[2,3,4,5]=18;

ans[3]=104;

(下面是重點)

再由n-1遞推分析n的情況:

1、當前面n-1個排列是鑰匙的排列,則

a、對2,3,4,5作為第n個高度來說都能滿足題意,有num[2,3,4,5]=ans[n-1];

b、對1,6(1,6等價,記號不同而已)來說,第n-1個高度不能為6,1,即要去掉

幾個不符合題意的組合;num[1]=ans[n-1]-num__[6](前n-1個中最後乙個為6的個數,實際寫**時要用另乙個陣列儲存)。同理 num[6]=ans[n-1]-num__[1](……)。也即num[1,6]=ans[n-1]-num__[6](……);

2、當前面n-1個排列不是鑰匙的排列,則

a、對i(i=2,3,4,5)作為第n個高度來說能滿足鑰匙的要求,則說明前面n-1個排列裡僅有兩類高度,且與i不同,加上i就剛好3類高度滿足題意。那麼前面兩類高度的選法總數是從其餘5類高度裡選出兩類,即c(5,2),但1,6不能同時選,故組合數為

c(5,2)-1。 再看排列數,n-1個位置,每個位置可任選兩類,但不能全部是同一類高度,故排列數2^(n-1)-2。

b、對i=1,6,同上面分析。因為1,6等價,所以我這裡舉i=1來說,前面兩類高度裡我有兩種取法,選6和不選6。

對於選6,組合數是c(4,1)(剩下2,3,4,5任意選一);再看排列數,每個位置可任選兩類,但不能全部是同一高度,且最後乙個也即第n-1個位置處不能為6,也可換個說法,最後乙個位置放i(i=2,3,4,5),前面n-2個位置任選6和i放,排列數4×(2^(n-2)-1)。前面不能全是和後面n-1的位置同一高度

對於不選6,組合數是c(4,2);再看排列數,每個位置可任選兩類,且不能全部是同一類高度,排列數2^(n-1)-2。

把上面的組合數與排列數相乘便得到一種情況下的num[i]的值,所有情況的值相加便得到結果。

三,源**

#include

#include

intmain

()for

(i=3

;i<=

25;i++)

return0;

}

遞迴加一些思考(鑰匙計數之二)

題目 f 鑰匙計數之二 time limit 1000ms memory limit 32768kb 64bit io format i64d i64u description 一把鑰匙有n個槽,2 本題很難想到用遞迴去做,並且除了遞迴還需要想清楚一些特殊的東西。1.當n 1是鑰匙的時候,則考慮他n...

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