hdu 1438 鑰匙計數之一

2021-07-28 12:18:06 字數 1210 閱讀 9668

problem

acm.hdu.edu.cn/showproblem.php?pid=1438

reference

blog.csdn.net/u010405898/article/details/9530769

blog.csdn.net/zoucharming/article/details/42918275

meaning

一把鑰匙 n 個槽,槽深可為 1、2、3、4,至少有 3 種槽深,至少有兩個連續的槽滿足深度差為 3。求合法鑰匙數。

analysis

a[i]:長度為 i 的合法鑰匙數

b[i]:長度為 i 的、以 1 或 4 結尾的合法鑰匙數

對任意一根長為 i 的合法鑰匙,第 i+1 位加上任意深度的槽也合法;

對一根長為 i 的不合法鑰匙,如果新增第 i+1 位就合法,有兩種情況:

1. 前 i 位全是 1 和 4(但不能只有 1 或只有 4),滿足了深度差為 3 的要求,但不滿足至少 3 種槽深的要求。此時在 i+1 位補 2 或 3 即可。

2. 前 i 位滿足了至少 3 種槽深的要求,但不滿足深度差為 3 的要求。此時如果第 i 位是 1 或 4,那在第 i+1 位補 4 或 1 即可。

也就是:前 i-1 位隨便放,第 i 位放 1 或 4,第 i+1 位放 4 或 1。(但前 i 位不能只有 1 和 4,或者合法)

(上面只考慮新加的乙個槽補在最後,而不考慮插在中間的情況,因為插中間其實就是在合法序列後任意補的情況)

所以:a[i] = a[i-1] * 4 + [ 2^(n-1) - 2 ] * 2 + 2 * 4^(i-2) - 2^(i-1) - b[i-1]

b[i] = a[i-1] * 2 + 2 * 4^(i-2) - 2^(i-1) - b[i-1]

source code

#include #define n 31

long long a[n+1] = ;

long long b[n+1] = ;

int main()

for(i=2; i<=n; ++i)

printf("n=%d: %i64d\n", i, a[i]);

return 0;

}

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 (狀壓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 注...

杭電OJ 1438 鑰匙計數之一

這個題目主要是數學推理。假設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 ...