程式設計思維week14 選做題

2021-10-07 02:48:42 字數 3365 閱讀 8393

然而還要結合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...