矩陣快速冪章節筆記(這里主要介紹的是我的錯題)
矩陣加速的遞推
1.1維k階 f(n)=f(n-1)+f(n-2)+f(n-i)可以添加系數 那么矩陣的第一列就是系數了,其它用未知數,然后計算。注意start數組,就是開始的數組是倒著來的,請看代碼(斐波那契)
2.k維1階 dp[i][j]=dp[i-1][x] 就是上一層要哪些 這里是順著的 行是i-1二維的狀態,列是i的二維的狀態
class Solution {
public:
const int mod=1000000007;
vector<vector<int>>mul(vector<vector<int>>a,vector<vector<int>>b)
{
int n=a.size(),m=b[0].size();
vector<vector<int>>arr(n,vector<int>(m,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
for(int k=0;k<a[0].size();k++)
{
arr[i][j]=(long)(arr[i][j]+(long)a[i][k]*b[k][j]%mod)%mod;
}
}
}
return arr;
}
vector<vector<int>>power(vector<vector<int>>a,int b)
{
int n=a.size();
vector<vector<int>>ans(n,vector<int>(n,0));
for(int i=0;i<n;i++)
ans[i][i]=1;
while(b>0)
{
if(b&1)
{
ans=mul(ans,a);
}
b=b>>1;
a=mul(a,a);
}
return ans;
}
int fib(int n) {
vector<vector<int>>start={{1,0}};
vector<vector<int>>m={{1,1},{1,0}};
if(n==0||n==1) return n;
vector<vector<int>>ans=mul(start,power(m,n-1));
return ans[0][0];
}
};
錯題
1.
https://leetcode.cn/problems/domino-and-tromino-tiling/description/?envType=problem-list-v2&envId=MvjeHJ4Z
歧路:這里我考慮的是鋪滿1-n的矩陣有多少個,因為有L字形的,就會有單獨的方塊出現,我認為它很麻煩,我就把這個問題轉化成幾個基本組合然后拼在一塊,最后發現容易算重而且組合有很多沒法列舉
正解:這里利用暴力,f(x,h)表示鋪滿長度為x的方塊,然后h表示是否有單獨的一塊挨著,然后進行枚舉可能性即可。最后會發現這個時間復雜度并非很好,那就嘗試打表找規律,會發現遞推式,最后矩陣加速即可
2.
https://leetcode.cn/problems/student-attendance-record-ii/description/?envType=problem-list-v2&envId=MvjeHJ4Z
出師未捷生先死:這里想到數位dp,然后三維dp方程列出,不會矩陣加速
柳暗花明又一村:這里仔細看看會發現這個后兩位的種類是有限度的,化為一維即可,總共兩維
綜上所述,觀察題目
咳咳,要不要仔細校準一下,容易眼花QAQ,作者:江海一歸客,原文鏈接:http://www.rzrgm.cn/jhygk/p/19172608

浙公網安備 33010602011771號