一、矩陣相乘
設C,A,B三個矩陣,C = A * B
則C[i][j] = ∑A[i][k] * B[k][j] (k = 0,1,2,...n-1)
矩陣相乘就是這么算的,依次用前面矩陣的每一行,依次乘后面矩陣的每一列,i就是行,j就是列。所以矩陣相乘就不滿足交換律。
實現 : 3個變量,3重for循環。
二、矩陣快速冪(仿二分快速冪)
計算An :
將矩陣TEMP置為E單位矩陣
if n為奇數
TEMP = TEMP * A ;
n--;
if n為偶數
A = A * A ;
n /= 2;
循環到n為0,TEMP就是答案
//109也承受不住30多次除2,時間復雜度0(logn * N3),N為矩陣階數(N*N矩陣),這樣的話100階矩陣也有超時的危險。
推薦題目 : http://poj.org/problem?id=3233
解題報告 : 點這里 (代碼寫的很一般)
三、矩陣優化遞推式
F(n)= A * F(n-1)
上面都是矩陣,根據矩陣的結合律,這個式子可以化為F(n)= An-1 * F(1)
這樣求An-1用矩陣快速冪去求,計算原問題的時間復雜度就從0(n)優化成了O(logn)。
一般難點是在怎么化為標准的式子(方程組化為矩陣)
題目鏈接 : http://acm.nyist.net/JudgeOnline/problem.php?pid=301
題目描述 :
給你一個遞推公式:f(x)=a*f(x-2)+b*f(x-1)+c,並給你f(1),f(2),a,b,c的值,請求出f(n)的值,由於f(n)的值可能過大,求出f(n)對1000007取模后的值。
注意 : -1對3取模后等於2,1<=n<=100000000 (10^9)
解析 :
化為標准式只有一個原則,F(n)的每個變量i,都對應着F(n-1)的每個變量i-1,有常量項就都為1。
舉個栗子,看題目的遞推公式,顯然左邊還缺了個x-1來對應右邊的x-2,所以
f(x) = a*f(x-2)+b*f(x-1)+c*1
f(x-1) = 0*f(x-2)+b*f(x-1)+0*1
1 = 0*f(x-2)+0*f(x-1)+1*1
將這個方程組化為矩陣
再化
就OK了!
*優化求斐波那契項是不是就很簡單了
*推薦題目 : http://acm.hdu.edu.cn/showproblem.php?pid=5950
*對一個二維dp的優化,題目鏈接 : 點這里
dp分析:dp[i][j] = ( dp[i-1][j] + dp[i-1][j-1] )%2 //i表示第i秒,j表示第j個燈,注意下j=0的情況
這個就不能像前面一樣,二維,而且j變量就根本不能那樣處理。。。。。
所以...
枚舉j,如果0≤j≤N。
dp[i][0] = ( dp[i-1][0] + dp[i-1][N] )%2
dp[i][1] = ( dp[i-1][1] + dp[i-1][0] )%2
......
dp[i][N] = ( dp[i-1][1] + dp[i-1][N-1] )%2
好像每次換一排燈,每個方程改變一個燈
四、其它應用
1,轉換
有些轉換可以等價於乘上了一個矩陣,那么多次轉換就好像依次乘了幾個矩陣,然后再用結合律...