然而還要結合dp
關於矩陣快速冪,以前學的時候寫過一篇部落格
還是和普通快速冪一樣的原理,通過二進位制拆分指數來讓冪的複雜度降到log級別,但是和普通快速冪的應用環境不同,矩陣快速冪常用來優化遞推式的計算,比較經典的問題就是求斐波那契數列的第1e7+項,這個問題在以前的部落格裡也寫過了。
這周遇到的問題都是對dp的優化
衣食無憂的 q老師 有一天突發奇想,想要去感受一下勞動人民的艱苦生活。
具體工作是這樣的,有 n 塊磚排成一排染色,每一塊磚需要塗上紅、藍、綠、黃這 4 種顏色中的其中 1 種。且當這 n 塊磚中紅色和綠色的塊數均為偶數時,染色效果最佳。
為了使工作效率更高,q老師 想要知道一共有多少種方案可以使染色效果最佳,你能幫幫他嗎?
input
第一行為 t,代表資料組數。(1 ≤ t ≤ 100)
接下來 t 行每行包括乙個數字 n,代表有 n 塊磚。(1 ≤ n ≤ 1e9)
output
輸出滿足條件的方案數,答案模 10007。
sample input21
2sample output26
解題思路
記錄三種狀態情況, a[i]表示i個格仔紅綠個數均為偶數的情況, b[i]為i個格仔,紅綠個數均為奇數的情況, c[i]為i個格仔紅綠有乙個為偶數的情況
遞推公式就可以寫出來了
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太大,不用試就知道直接推會tle
這時候用到矩陣快速冪的常規套路,推乙個常數矩陣幫助我們算結果
}忙碌了乙個學期的 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 input
3 20 1
1 04 3
1 2 3
1 2 3
1 2 3
sample output29
解題思路
天數連續,問題具有子結構性質;第n天的結果由今天和第n-1天的衣服決定,是個很常規的遞推
令?[?][?]表示第 i 天,穿的衣服為 j 所獲得的快樂值總和
?[?][?]=max(?[?−1][?]+?[?][?]),1≤?≤?
但是直接推的時間複雜度為o(n * m * m),無法接受
根據已經忘光的 離散數學知識,可以發現我們的解法能換成矩陣乘法的形式
?[?][?]=∑?[?][?]∗?[?][?] ⇒max(?[?][?]+?[?][?])
因為+對max是可分配的,同樣*對+是可分配的
矩陣快速冪要求矩陣乘法具有結合律,這裡有乙個證明過程:
程式設計 week14 貓睡覺
解題思路 把時間轉換成分鐘,好進行比較 設定乙個ptp結構體,記錄一段開始結束的時間 一開始的輸入,記錄在rem陣列裡面 並且按照start的公升序排列 並且因為每天的表都是一樣的 所以要把第乙個番的時間填到最末尾 這樣就可以前後2天聯絡起來 然後找出合法的睡覺時間 記錄下來 並且把超出今天的部分,...
程式設計思維與實踐 Week14 限時大模擬
題目input 多組資料,多組資料,多組資料哦,每組資料的格式如下 第1行輸入三個整數,a 和 b 和 n 1 a 24,1 b 24,1 n 20 第2到n 1行為每日的新番時間表,每行乙個時間段,格式形如 hh mm hh mm 閉區間 這是一種時間格式,hh mm 的範圍為 00 00 到 2...
程式設計思維與實踐 Week14 貓睡覺問題
將時間用分鐘儲存,若時間段跨天,則把跨天後的時間加上24小時。將時間段讀取完後按開始時間排序。對每乙個時間段進行判斷,記錄當前已經醒著的時間,並判斷每兩個追番時間之間是否能睡覺,能睡,則重置醒著的時間,直到結束。最後還需要判斷最後乙個時間段和第乙個時間段之間能不能睡覺,因為一天是個閉環。includ...