矩阵加速的递推
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方程列出,不会矩阵加速
柳暗花明又一村:这里仔细看看会发现这个后两位的种类是有限度的,化为一维即可,总共两维
综上所述,观察题目