題目大意:棒子上套環。第i個環能拿下的條件是:第i-1個環在棒子上,前i-2個環不在棒子上。每個環可以取下或放上,cost=1。求最小cost。mod 200907。
解題思路:
題目意思非常無聊,感覺是yy的。
設$dp[i]$為取第i個環時的總cost。
$dp[1]=1$,$dp[2]=2$,前兩個環取下是沒有條件要求的。
從i=3開始,由於條件對最後的環限制最大,所以從最後乙個環開始取。
$p[3]=5$(先取下第乙個環,然後第三個環,然後放上第乙個環,然後取下第二個環,然後取下第乙個環)
$dp[4]=10$(規律是:取i環花費1,依賴花費$dp[i-1]$、$2*dp[i-2]$)
所以$dp[i]=dp[i-1]+2*dp[i-2]+1$
任何遞推數列都能構造矩陣求解,有n個引數的通項公式,至少需要構造$1*n$的矩陣
考慮到矩陣乘法的維數限制$[n,m]*[m,p]$,通常構造成$n*n$的矩陣。
構造方法就是按矩陣乘法的特性,先構造出冪矩陣第一列,然後yy出剩餘列。
本題構造如下:
$\beginf2 & f1 & 1\\ 0 & 0 & 0\\ 0 & 0 & 0\end\begin1 & 1&0 \\ 2 & 0&0 \\ 1& 0 &1 \end=\beginf3 & f2&1 \\
0 & 0&0 \\ 0& 0 &0\end$
特判n=1、n=2,從n=3開始,冪(n-2)次,乘以基礎f2、f1的矩陣。
#include "cstdio
"#include
"cstring
"#define ll long long
#define mod 200907
#define k 3
struct
matrix
matrix(ll *val)
};matrix
operator *(matrix a,matrix b)
return
ret;
}matrix
operator ^ (matrix a,int
n)
return
ret;
}int
main()
; ll pval=;
matrix base(bval),pow(pval),ans=pow^(n-2
); ans=base*ans;
printf(
"%i64d\n
",ans.mat[0][0]%mod);}}
}
HDU 2842 遞推 矩陣快速冪
題目大意 棒子上套環。第i個環能拿下的條件是 第i 1個環在棒子上,前i 2個環不在棒子上。每個環可以取下或放上,cost 1。求最小cost。mod 200907。解題思路 題目意思非常無聊,感覺是yy的。設 dp i 為取第i個環時的總cost。dp 1 1 dp 2 2 前兩個環取下是沒有條件...
hdu 2842 矩陣高速冪 遞推
題意 乙個中國環的遊戲,規則是乙個木棒上有n個環。第乙個環是能夠任意放上或拆下的,剩下的環x假設想放上或拆下必須前乙個環x 1是放上的且前x 2個環所有是拆下的,問n個環最少多少次操作能夠所有拆掉。題解 須要進行遞推,首先第一步肯定是要拆第n個環保證操作次數最少,由於後面的環是否存在對前面的環不造成...
hdu 3519 遞推 矩陣快速冪
題目 題意 有n個硬幣排成一排,有正有反,問有2個以上連續的相同硬幣有幾種方案 分析 典型的推公式用矩陣快速冪求解的題目。偷個懶,貼個別人的推導 長度為 n 的 01 串一共有 2 n 種不同的排列方法 設 f n 為長度是 n 的不包含連續 3 個或以上相同的 1 或 0 的 01 串 則 f 1...