題意:題目大概說用k個不同的字母,有多少種方法構造出兩個長度n最長公共子串長度為m的字串。
思路n的規模達到了10億,而且又是方案數,自然就想到構造矩陣用快速冪解決。
考慮用dp解決可以這麼表示狀態:
狀態的轉移就是,末尾j個相同的可以轉移到0個相同的也能轉移到j+1個相同的(前提是j
而對於這個狀態可以構造矩陣去轉移,即乙個(m+1)*(m+1)的矩陣,矩陣i行j列表示從末尾i個相同轉移到末尾j個相同的方案數,而該矩陣的n次冪的第0行的和就是長度n的字串末尾各個情況的方案數。
不過樣表示狀態最後求出來不是要求的,因為lcs小於m的也會包含於其中。那麼減去小於m的方案數不就ok了!
於是,一樣再構造乙個m*m的矩陣求n次冪,就ok了。
f[i][j]表示構造好前i個,最後j個相同的方案數
f[i][j]=f[i-1][j-1]*k 【最後一位有k種方案相同】
f[i][0]=sigma(f[i-1][j])*k*(k-1) j=0~m 【倒數第二位相同最後一位不同有k*(k-1)種方案】
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #includeview code11 #include 12
using
namespace
std;
13#define mod 1000000007
14 typedef long
long
ll;15
16struct
mat;
20mat mul(mat a, mat b)30}
31}32return
m;33}34
int solve(int n, int m, int
k)35
53int ans = 0;54
for(int i = 0; i <= m ; i++)
58return
ans;59}
60int
main()
6170
return0;
71 }
HDU5863(dp,矩陣加速)
題意 用k種字元來組成另個長度為n,但是最大字串匹配為m的方案數。匹配必須相同位置連續。dp i j 表示現在構造了i長度,長度j字尾連續對應相等,那麼dp i j dp i 1 j 1 k,特別地,dp i 0 sigma dp i 1 j k 1 k 0 但是n很大,不能o n 轉移。所以要想到...
hdu 5564 快速矩陣冪 數字dp
hdu5564 這道題一看就知道用數字dp,但是在狀態轉移時,發現不可能轉移成功,10 9,但是發現轉移可以用矩陣來進行表示,因此 但是要注意矩陣最後一列用來計算結果。看看就好了,畢竟卡著時間過的,2500ms左右,標程3000ms.hdu 5564 快速矩陣冪 數字dp include inclu...
dp 矩陣乘法快速冪
1 p1926 斐波那契 include include include using namespace std long long n const int mod 1000000007 long long nw 2 2 ans 2 2 long long t 2 2 void mul1 void ...