10pts玄关求条
查看原帖
10pts玄关求条
1417515
qzh120124楼主2025/7/31 11:52
#include<bits/stdc++.h>
using namespace std;
int n,m,k,f[1010][210][210][2];
string a,b;
int main( )
{
	cin>>n>>m>>k;
	cin>>a>>b;
	for(int i=0;i<n;i++)
	{
		if(a[i]==b[0])
		{
			f[0][i][1][1]=1;
		}
	}
	for(int i=1;i<n;i++)
	{
		f[0][i][1][0]=f[0][i-1][1][0]+f[0][i-1][1][1];
	}
	for(int i=1;i<m;i++)
	{
		for(int j=i;j<n;j++)
		{
			for(int kk=1;kk<=k;kk++)
			{
				/*if(k>(i+1)||k>(j+1))
				{
					break;
				}*/
				f[i][j][kk][0]+=f[i][j-1][kk][0]+f[i][j-1][kk][1];
				f[i][j][kk][0]%=1000000007;
				if(a[j]==b[i])
				{
					f[i][j][kk][1]+=f[i-1][j-1][kk-1][0]+f[i-1][j-1][kk-1][1];
					if(a[j-1]==b[i-1])
					{
						f[i][j][kk][1]+=f[i-1][j-1][kk][1];
					}
					f[i][j][kk][1]%=1000000007;
				}
			}
		}
	}
	/*for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			for(int kk=1;kk<=k;kk++)
			{
				cout<<f[i][j][kk]<<' ';
			}
		}
	}*/
	cout<<(f[m-1][n-1][k][1]+f[m-1][n-1][k][0])%1000000007;
	/*for(int i=0;i<n;i++)
	{
		cout<<f[0][i][1][0]<<' '<<f[0][i][1][1]<<endl;
	}*/
	return 0;
}
//f[i][j][k][1]b前i个和a前j个匹配用k个名额 ,j选;
//f[i][j][k][0]b前i个和a前j个匹配用k个名额 ,j不选;

谢谢大佬

2025/7/31 11:52
加载中...