杭電OJ 1438 鑰匙計數之一

2021-06-21 06:02:48 字數 1338 閱讀 7197

這個題目主要是數學推理。

假設one[i],two[i],three[i],four[i]分別表示一共有i個槽的情況下第乙個槽為1、2、3、4的情況,lock[i]表示有i個槽的情況下鎖匙的個數,容易得到lock[i] = one[i] + two[i] + three[i] + four[i]。另外可以知道one[i]和four[i]的情況是一樣多的,因為對於所有的第乙個槽為1的合法情況,如果將其中的1全部變為4,4全部變為1,必然也是合法的,這樣對於每乙個第乙個槽為1的情況必然對應著乙個第乙個槽為4的情況,同理對於所有的第乙個槽為4的情況也必然有乙個且僅有乙個第乙個槽為1的情況與之對應,所以可以得出結論one[i] = four[i];相同的分析方法可以得到two[i] = three[i];所以可以得到lock[i] = 2 * one[i] + 2 *two[i];

關於one[i]的計算可以分為以下兩種情況:(1)第乙個槽為1不影響後面(2)第乙個槽為1對後面的有影響。對於第一種情況總的個數為one[i-1] + two[i-1] + three[i-1] + four[i-1];

對於第二種情況可以認為如果第一位不是1的話那麼序列就是非法的,在這種情況下第二位必然為4(如果第二位不為4的話,那麼第一位為1就對後面序列的合法性沒有影響)。

在第一位為1第二位為4確定的情況下一共有4^(i-2)種情況,在這種情況下需要去掉後面的i-2位只有1或者4的情況,這種情況個數為2^(i-2),另外還要去掉在第二位為4的情況下後面的i-1位合法的情況four[i-1],也即one[i-1];所以第二種情況下總的次數為4^(i-2) - one[i-1] -2^{i-2)。

綜上所述:one[i] = one[i-1] + two[i-1] + three[i-1] + four[i-1] + 4 ^ (i-2)  - one[i-1] -2^(i-2)。

關於two[i]的計算和one[i]的計算類似,也分為兩種情況,第一種情況是相同的,下面對第二種情況進行分析:計算去掉第一位的2之後,後面是非法序列的個數。如果去掉了第一位的2之後後面的序列非法則表明後賣的序列僅由1和4組成,這種情況的個數為2^(i-1),但是要去掉全部為1和全部為4的兩種情況,所以總的數量為2^(i-1) -2.

根據上面的分析可以得出lock[i]的遞推式:lock[i] = 6 * one[i-1] + 8 * two[i-1] + 2 * 4^(i-2) + 2 * 2^(i-2) -4 。

下面附上ac**:

#include #include const int n = 32;

int main(){

__int64 one[n],two[n],lock[n];

one[2] = 0;two[2] = 0;lock[2] = 0;

for(int i=3;i

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

鑰匙計數之一 HDU 1438 (狀壓DP)

一把鎖匙有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 注...