問題分析
problem analyse 遞推題
algorithm analyse 比起以前做過的遞推題,這一題算比較麻煩的了(當然,原因是我沒有想到
因為有了a、c需要出現偶數次的要求,就出現合法和不合法的不同分組。
在不合法的組裡,又有
1.a出現奇數次、c出現偶數次;
2.c出現奇數次、a出現偶數次;
3.a出現奇數次、c出現奇數次;
三種情況。
我們用陣列
f[n][0]儲存長度為n,合法的字串的個數。
f[n][1]儲存長度為n,僅a出現奇數次的字串的個數。
f[n][2]儲存長度為n,僅c出現奇數次的字串的個數。
f[n][3]儲存長度為n,a、c出現奇數次的字串的個數。
f[n][0]
長度為n-1的合法字串在末尾加上乙個b或者d,都可以變成長度為n的合法字串。
長度為n-1的僅a出現奇數次的字串再在末尾加上乙個a,也可以變成合法字串。
長度為n-1的僅c出現奇數次的字串再在末尾加上乙個c,也可以變成合法字串。
所以,f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2];
f[n][1]
長度為n-1的合法字串在末尾加上a,都可以變成長度為n的僅a出現奇數次的字串。
長度為n-1的僅a出現奇數次的字串再在末尾加上乙個b或者d,也可以變成僅a出現奇數次的字
符串。長度為n-1的a、c出現奇數次的字串再在末尾加上乙個c,也可以變成僅a出現奇數次的字串
。所以,f[n][1] = 2 × f[n-1][1] + f[n-1][0] + f[n-1][3];
f[n][2]
長度為n-1的合法字串在末尾加上c,都可以變成長度為n的僅c出現奇數次的字串。
長度為n-1的僅c出現奇數次的字串再在末尾加上乙個b或者d,也可以變成僅c出現奇數次的字
符串。長度為n-1的a、c出現奇數次的字串再在末尾加上乙個a,也可以變成僅c出現奇數次的字串
。所以,f[n][2] = 2 × f[n-1][2] + f[n-1][0] + f[n-1][3];
f[n][3]
長度為n-1的a、c出現奇數次的字串在末尾加上一b或者d,都可以變成長度為n的a、c出現奇數
次的字串。
長度為n-1的僅a出現奇數次的字串再在末尾加上乙個c,也可以變成a、c出現奇數次的字串
。長度為n-1的僅c出現奇數次的字串再在末尾加上乙個a,也可以變成a、c出現奇數次的字串
。所以,f[n][3] = 2 × f[n-1][3] + f[n-1][1] + f[n-1][2];
綜上所述,我們得到:
f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2]; ①
f[n][1] = 2 × f[n-1][1] + f[n-1][0] + f[n-1][3]; ②
f[n][2] = 2 × f[n-1][2] + f[n-1][0] + f[n-1][3]; ③
f[n][3] = 2 × f[n-1][3] + f[n-1][1] + f[n-1][2]; ④
f[1][0] = 2
f[1][1] = 1
f[1][2] = 1
f[1][3] = 0
/**** 搞出這個我就很哈皮的去敲快速冪了。。。然而大牛。。。 ****/
發現f[1][1]與f[1][2]初始狀態相同,而且以後迭代方程也相同,所以f[n][1] = f[n][2]
又有f[n][0] + f[n][3] = f[n][1] + f[n][2]
∵f[n][0] + f[n][1] + f[n][2] + f[n][3] = 4^n
∴f[n][0] + f[n][3] = f[n][1] + f[n][2] = 2 × 4^(n-1)
∴f[n-1][1] + f[n-1][2] = 2 × 4^(n-2)
∴f[n][0] = 2 × f[n-1][0] + f[n-1][1] + f[n-1][2] = 2 × f[n-1][0] + 2 × 4^(n-2)
我們得到:
f[n][0] = 2 × f[n-1][0] + 2^(2n-3)
f[n-1][0] = 2 × f[n-2][0] + 2^(2n-5)
┋f[n-m][0] = 2 × f[n-m-1][0] + 2^(2n-2m-3)
┋f[2][0] = 2 × f[1][0] + 2^1
f[1][0] = 2
開始一層層往下迭代:
f[n][0]
= 2 × f[n-1][0] + 2^(2n-3)
= 2^2 × f[n-2][0] + 2^(2n-4) + 2^(2n-3)
┋= 2^m × f[n-m][0] + 2^(2(n-m)-1+m-1) + … + 2^(2n-3)
= 2^(n-1) × f[1][0] + 2^(n-1) + 2^n +… + 2^(2n-3)
f[1][0] = 2;
∴f[n][0] = 2^n + 2^(n-1) + 2^n +… + 2^(2n-3) = 2^(2n-2) + 2^(n-1)
#includeint pow(__int64 n)
return r;
} int main()
printf("\n");
} return 0;
}
快速冪 HDU2065 紅色病毒 問題
problem description 醫學界發現的新病毒因其蔓延速度和internet上傳播的 紅色病毒 不相上下,被稱為 紅色病毒 經研究發現,該病毒及其變種的dna的一條單鏈中,胞嘧啶,腺嘧啶均是成對出現的。現在有一長度為n的字串,滿足一下條件 1 字串僅由a,b,c,d四個字母組成 2 a出...
HDU2065 紅色病毒 問題(矩陣快速冪)
題意 中文題,不再描述。分析 參考這篇部落格,寫的非常好,我也是看的的。個人理解 我把原文的狀態轉移方程又補充了一下。為0是因為下乙個狀態不能由當前狀態得到。然後提取出係數得到矩陣 const matrix p 接下來就是然後建立乙個矩陣乘法函式 matrix multi const matrix ...
HDU 2065 紅色病毒
思路 a c a c a c 奇偶 奇奇 奇 偶奇 偶偶 偶 設a 偶 c 偶 的方法數為g n 則 g n ac 偶偶 ac 偶偶 ac 奇偶 ac 偶奇 由於對稱可知 ac 奇偶 ac 偶奇 故 g n 2 ac 偶 令ac 偶 f n 則g n 2 f n 1 下面討論f n f n ac 奇...