hdu5863 dp 矩陣快速冪

2022-08-17 07:00:25 字數 1114 閱讀 1133

題意:題目大概說用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 #include 

11 #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 }

view code

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 ...