1. 程式人生 > 實用技巧 >PMBOK指南第六版知識點串講-第二章專案執行環境

PMBOK指南第六版知識點串講-第二章專案執行環境

\(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;
}