矩陣乘法 DP JZOJ 3294 超級跳馬

2022-04-30 19:39:15 字數 1331 閱讀 2514

description

input

僅有一行,包含兩個正整數n, m,表示棋盤的規模。

output

僅有一行,包含乙個整數,即跳法種數mod 30011。

sample input

3 5
sample output

10
data constraint

對於10%的資料,1 ≤ n ≤ 10,2 ≤ m ≤ 10;

對於50%的資料,1 ≤ n ≤ 10,2 ≤ m ≤ 10^5;

對於80%的資料,1 ≤ n ≤ 10,2 ≤ m ≤ 10^9;

對於100%的資料,1 ≤ n ≤ 50,2 ≤ m ≤ 10^9。

這題,你敢信我比賽的時候居然沒想到字首和優化dp……

f[i][j]表示第j行第i列的方案數,則有

$f[i][j]=\sum_^f[i-2*k+1][j\pm 1]$

設s1[i][j]表示距離當前列有奇數列(奇數獵?)的字首和,s2差不多偶數獵

$s1[i][j]=s1[i-1][j\pm 1]+s2[i-1][j]$

$s2[i][j]=s1[i-1][j]$

可以把s2換成s1

$s1[i][j]=s1[i-1][j\pm 1]+s1[i-2][j]$

直接推會爆,所以可以矩陣乘法優化

設乙個$1\times 2n$的矩陣a,前n個為s1[i],後n個為s1[i-1]

則要有矩陣t與a相乘得出b[s1[i+1],s1[i]]

然後根據上面的柿子,t為

?,單位矩陣

單位矩陣,空矩陣

?處可以較顯然地看出為

1,1,0,0,0

1,1,1,0,0

0,1,1,1,0

0,0,1,1,1

0,0,0,1,1

(n=5)

然後快速冪即可

最後記住最後乙個位置只能從兩行轉移,所以答案為s1[m][n]-s1[m-2][n]

#include #include 

#include

using

namespace

std;

const

int n=110

;const

int p=3e4+11

;int

n,m;

struct

rect

}t,a,b;

rect pow(rect x,

inty)

return

ans;

}int

main()

view code

矩陣乘法 矩陣乘法的基本實現

求解關於兩個矩陣的乘積 參考線性代數裡面的兩個矩陣相乘的規則,我這裡不再贅述,詳情附上了乙個鏈結,我的程式設計也是用了裡面的例子 這裡寫鏈結內容 具體的過程我會在 片裡面加上注釋 矩陣乘法 author seen 2015 09 18 include using namespace std int ...

mysql 矩陣乘法 矩陣乘法高階操作

對於矩陣乘法的一些操作 我們 其實 大部分是 多追加乙個係數 或者和 其他演算法連在一起。至於核心無非就是 先列出dp 方程再優化 或者 直接 對題目進行建模 構建矩陣。至於矩陣乘法的正確性 形狀的正確性 是可以證明的 但是內部最真實的正確性我還無法證明。這道題是 字串型別的題目 求方案數 很煩 大...

329 矩陣中的最長遞增路徑

給定乙個整數矩陣,找出最長遞增路徑的長度。對於每個單元格,你可以往上,下,左,右四個方向移動。你不能在對角線方向上移動或移動到邊界外 即不允許環繞 示例 1 輸入 nums 9,9,4 6,6,8 2,1,1 輸出 4 解釋 最長遞增路徑為 1,2,6,9 示例 2 輸入 nums 3,4,5 3,...