求助,子串这题,本机 WA 提交 WA
查看原帖
求助,子串这题,本机 WA 提交 WA
398190
lanretE楼主2022/5/3 21:38

rt,写了个四维的 dp,f[i][j][l][p]f[i][j][l][p] 表示截至 a 的前 i 字符凑出 b 的前 j 字符并且用了 l 段,p 表示 a 的第 i 位是否取

写了滚动数组

#include<iostream>
using namespace std;
const int mod=1e9+7;
int n,m,k;
char a[1010],b[1001];
int f[2][205][205][2];
int main(){
	cin>>n>>m>>k;
	scanf("%s%s",a+1,b+1);
	f[0][0][0][0]=1;
	f[1][0][0][0]=1;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			for(int l=0;l<=m;++l){
					f[i&1][j][l][0]+=(f[i&0][j][l][0]+f[i&0][j][l][1])%mod;
					if(a[i]==b[j]){
						f[i&1][j][l][1]=(f[i&0][j-1][l-1][0]+f[i&0][j-1][l][1]+f[i&0][j-1][l-1][1])%mod;						
					}
					else{
						f[i&1][j][l][1]=0;
					}
				}
//	cout<<f[1][1][1][1]<<endl; 
	cout<<f[n][m][k][1]+f[n][m][k][0]<<endl;
	return 0;
}
2022/5/3 21:38
加载中...