PMBOK指南第六版知識點串講-第二章專案執行環境
阿新 • • 發佈:2020-10-12
令 \(f_{i,j,l,0/1}\) 表示 \(A\) 中前 \(i\) 個字元,取出 \(l\) 個子串,拼成了 \(B\) 中前 \(j\) 個字元,第 \(i\) 個字元取/不取的方案數。
不取直接累加 \(A\) 中上一個字元的狀態。
\[f_{i,j,l,0}=f_{i-1,j,l,0}+f_{i-1,j,l,1} \]取就分接在上一個子串和新開一個子串討論。
\[f_{i,j,1}=f_{i-1,j-1,l,1}+f_{i-1,j-1,l-1,0}+f_{i-1,j-1,l-1,1} \]然後這題就做完了,記得滾動陣列,取模和初始化。
時間複雜度 \(O\left(nmk\right)\)。
code:
#include<bits/stdc++.h> using namespace std; #define N 205 #define Mod 1000000007 #define For(i,x,y)for(i=x;i<=(y);i++) #define Mems(i,j)memset(i,j,sizeof i) #define Memc(i,j)memcpy(i,j,sizeof i) string a,b; int f[N][N][2],g[N][N][2]; int main() { int n,m,i,j,k,l; cin>>n>>m>>k>>a>>b; g[0][0][0]=1; For(i,1,n) { f[0][0][0]=1; For(j,1,m) For(l,1,k) { if(a[i-1]==b[j-1])f[j][l][1]=((g[j-1][l][1]+g[j-1][l-1][0])%Mod+g[j-1][l-1][1])%Mod; f[j][l][0]=(g[j][l][1]+g[j][l][0])%Mod; } Memc(g,f); Mems(f,0); } cout<<(g[m][k][0]+g[m][k][1])%Mod; return 0; }