Q老師度假 動態規劃dp 矩陣快速冪優化

2021-10-07 03:05:42 字數 1411 閱讀 4083

忙碌了乙個學期的 q老師 決定獎勵自己 n 天假期。假期中不同的穿衣方式會有不同的快樂值。

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

在 n 天假期結束後,q老師 最多可以獲得多少快樂值?

輸入檔案包含多組測試樣例,每組測試樣例格式描述如下:

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

接下來 m 行,每行給出 m 個整數,其中第 i 行的第 j 個整數,表示 f[i][j]。(1 ≤ f[i][j] ≤ 1000000)測試樣例組數不會超過 10。

每組測試樣例輸出一行,表示 q老師 可以獲得的最大快樂值。

320

1104

3123

1231

23

2

9

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

設dp狀態:

令 f[i][j] 表示第 i 天,穿的衣服為 j 所獲得的快樂值總和

根據 dp 狀態,不難得到如下的轉移方程

• 列舉前一天穿的衣服為 k,即

•f[i][j] = max (1<=k<=m)

直接求解時間複雜度為o(n * m * m)會超時

需要用矩陣快速冪進行優化

矩陣快速冪轉化方法

轉換過程

•c[i][j] = ∑(a[i][k] ∗ b[k][j]) ⇒ max (a[i][k]+ b[k][j])

• 將累加換成了max,乘法換成了加法

這樣是可行的,它依然滿足結合律,嚴謹的數學證明在這裡不再展示。

#include

#include

using

namespace std;

int m;

long

long

max(

const

long

long

&x,const

long

long

& y)

struct matrix

return ret;

}matrix()

matrix

(const matrix&t)};

matrix quick_pow

(matrix a,

int x)

return ret;

}int

main()

return0;

}

openjudge 最大子矩陣 (DP 動態規劃)

include include cstring include include iomanip include vector include cmath include stack include algorithm include include map include queue using n...

動態規劃 dp

威威貓系列故事 打地鼠 威威貓最近不務正業,每天沉迷於遊戲 打地鼠 每當朋友們勸他別太著迷遊戲,應該好好工作的時候,他總是說,我是威威貓,貓打老鼠就是我的工作!無話可說.我們知道,打地鼠是一款經典小遊戲,規則很簡單 每隔乙個時間段就會從地下冒出乙隻或多隻地鼠,玩遊戲的人要做的就是打地鼠。假設 1 每...

動態規劃,dp

線性動規區間動規樹形動規 區間動規 根據題目要求,全域性最優滿足區域性最優 典型題例 加分二叉樹 洛谷1040 題目介紹 題目描述 設乙個n 個節點的二叉樹t 的中序遍歷為 1,2,3,n 其中數字 1,2,3,n 為節點編號。每個節點都有乙個分數 均為正整數 記第j 個節點的分數為dj。二叉樹t ...