10pts求调
查看原帖
10pts求调
489725
方块鼠楼主2024/8/19 11:05
#include<iostream>
using namespace std;
int f[2000][2000];
int p,k,len,n;
int word_num[2000][2000];
string word[2000];
string s1="";
int check_(string s){
	for(int i=1;i<=n;i++){
		if(word[i]==s){
			return 1;
		}
	}
	return 0;
}
int main(){
	cin>>p>>k;
	string s;
	for(int i=1;i<=p;i++){
		cin>>s;
		s1+=s;
	}
	int len=s1.length();
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>word[i];
	}
	for(int i=1;i<=len;i++){
		word_num[i][i]=check_(s1.substr(i-1,1));
	}
	for(int i=1;i<=len;i++){
		for(int j=i+1;j<=len;j++){
			for(int l=i;l<=j-1;l++){
				word_num[i][j]=max(word_num[i][j],word_num[i][l]+check_(s1.substr(l,j-l)));
			}
		}
	}
	for(int i=1;i<=len;i++){
		for(int j=1;j<=min(k,i-1);j++){
			if(j==1){
				f[i][j]=word_num[1][i];
			}else{
				for(int l=1;l<=i-1;l++){
					f[i][j]=max(f[i][j],f[l][j-1]+word_num[l+1][i]);
				}
			}
		}
	}
	cout<<f[len][k]<<endl;
}
2024/8/19 11:05
加载中...