矩陣快速冪優化DP 例題詳細分析

2021-10-06 08:46:18 字數 2884 閱讀 5910

矩陣快速冪性質

快速求解線性遞推式的結果,如斐波那契遞推

優化的 dp 需要滿足的條件

轉移方程為線性遞推式

轉移次數超級多(n 很大)

衣食無憂的 q老師 有一天突發奇想,想要去感受一下勞動人民的艱苦生活。

具體工作是這樣的,有 n 塊磚排成一排染色,每一塊磚需要塗上紅、藍、綠、黃這 4 種顏色中的其中 1 種。且當這 n 塊磚中紅色和綠色的塊數均為偶數時,染色效果最佳。

為了使工作效率更高,q老師 想要知道一共有多少種方案可以使染色效果最佳,你能幫幫他嗎?input第一行為 t,代表資料組數。(1 ≤ t ≤ 100)

接下來 t 行每行包括乙個數字 n,代表有 n 塊磚。(1 ≤ n ≤ 1e9)output輸出滿足條件的方案數,答案模 10007。

sample input21

2sample output26

連續格仔染色,很明顯有子結構的性質,可以考慮 dp。我們可以需要考慮dp的狀態轉移方程:

題目問 n 個格仔,紅綠均為偶數的染色方案數

因此令 a[i] 表示 i 個格仔,紅綠均為偶數的染色方案數

只有 a[i] 是否足夠?顯然是不夠的,因為倆偶數也可以從一奇一偶轉移過來。

因此我們進行 dp 狀態新增:

b[i] 表示 i 個格仔,紅綠均為奇數的染色方案數

c[i] 表示 i 個格仔,紅綠有乙個為偶數的染色方案數

dp 轉移方程:

根據 dp 狀態,仔細思考轉移情況即可得到

a[i] = 2 * a[i-1] + c[i-1]

b[i] = 2 * b[i-1] + c[i-1]

c[i] = 2 * a[i-1] + 2 * b[i-1] + 2 * c[i-1]

由於n是1e9所以o(n)的dp是不行的,所以需要進行優化——矩陣快速冪優化。

}忙碌了乙個學期的 q老師 決定獎勵自己 n 天假期。

假期中不同的穿衣方式會有不同的快樂值。

已知 q老師 一共有 m 件襯衫,且如果昨天穿的是襯衫 a,今天穿的是襯衫 b,則 q老師 今天可以獲得 f[a][b] 快樂值。

在 n 天假期結束後,q老師 最多可以獲得多少快樂值?input輸入檔案包含多組測試樣例,每組測試樣例格式描述如下:

第一行給出兩個整數 n m,分別代表假期長度與 q老師 的襯衫總數。(2 ≤ n ≤ 100000, 1 ≤ m ≤ 100)

接下來 m 行,每行給出 m 個整數,其中第 i 行的第 j 個整數,表示 f[i][j]。(1 ≤ f[i][j] ≤ 1000000)

測試樣例組數不會超過 10。output每組測試樣例輸出一行,表示 q老師 可以獲得的最大快樂值。sample input3 2

0 11 0

4 31 2 3

1 2 3

1 2 3

sample output2

9天數連續,很明顯有子結構的性質,可以考慮 dp

n 不是很大,因此不一定是矩陣快速冪優化,先列出 dp 狀態和 dp 轉移方程再進行判斷

快速排序 的 尾遞迴優化 詳細分析

void qsort int arr,int low,int high 尾遞迴詳細介紹 尾遞迴概念 如果乙個函式中所有遞迴形式的呼叫都出現在函式的末尾,當遞迴呼叫是整個函式體中最後執行的語句且它的返回值不屬於表示式的一部分時,這個遞迴呼叫就是尾遞迴。尾遞迴函式的特點是在回歸過程中不用做任何操作,這個...

快速排序詳細分析(Java實現)

排序過程 1,找乙個基準數,找陣列內的任意乙個數都行,一般都是以陣列第乙個數為基準數 2,從陣列末位向前迴圈找比基準數小的,找到了先停下,也就是記錄當前的索引 從陣列開端向後迴圈找比基準數大的,找到了先停下,也就是記錄當前的索引 3,將第二步的兩個索引的位置的數值交換,這樣比基準數大的就到了基準數的...

DP之 石子合併1 2 (詳細分析)

設有n堆石子排成一排,其編號為1,2,3,n。每堆石子有一定的質量,可以用乙個整數來描述,現在要將這n堆石子合併成為一堆。每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量之和,合併後與這兩堆石子相鄰的石子將和新堆相鄰,合併時由於選擇的順序不同,合併的總代價也不相同。例如有4堆石子分別為 1 3 ...