一个和所有题解都不同的O(nm^2 k)做法
查看原帖
一个和所有题解都不同的O(nm^2 k)做法
482007
TanX_1e18楼主2023/7/28 15:09
#include<bits/stdc++.h>
using namespace std;
struct zi
{
	short l,r;
	int lt;
}d[2000009];
int head[1009];
int top;
void mkb(int x,short l,short r)
{
	top++;
	d[top].l=l;
	d[top].r=r;
	d[top].lt=head[x];
	head[x]=top;
}
const int mod=1e9+7;
short n,m,k;
int f[1002][202][2];
string a,b;
int main()
{
	cin>>n>>m>>k;
	cin>>a>>b;
	for(short i=1;i<=n;i++)
	for(short j=1;j<=m;j++)
	{
		string s1="",s2="";
		for(short len=1;i+len-1<=n&&j+len-1<=m;len++)
		{
			s1+=a[i+len-2];
			s2+=b[j+len-2];
			if(s1==s2)
			mkb(i,j,j+len-1);
			else
			break;
		}
	}
	for(short i=0;i<=n;i++)
	f[i][0][0]=1;
	for(short x=1;x<=k;x++)
	{
		for(short i=0;i<=n;i++)
			for(short j=0;j<=m;j++)
				f[i][j][x%2]=0;
		for(short i=1;i<=n;i++)
		{
			for(short j=1;j<=m;j++)
			f[i][j][x%2]=(f[i][j][x%2]+f[i-1][j][x%2])%mod;
			for(int opt=head[i];opt;opt=d[opt].lt)
			{
				short j=i+d[opt].r-d[opt].l;
				f[j][d[opt].r][x%2]=(f[j][d[opt].r][x%2]+f[i-1][d[opt].l-1][(x+1)%2])%mod;
			}
		}
	}
	cout<<f[n][m][k%2];
	return 0;
}

理论上复杂度可以卡到O(nm^2 k)。
但是过去了。。。

2023/7/28 15:09
加载中...