60pts求助
查看原帖
60pts求助
690160
ask_silently楼主2023/9/23 18:33
#include <bits/stdc++.h>
using namespace std;

int p,k,ge;
int d[210][210],dp[210][210][45];

string s;
string a[10];

inline int read(){
	int t=0,f=1;
	register char c=getchar();
	while(c<48||c>57) f=(c=='-')?(-1):(f),c=getchar();
	while(c>=48&&c<=57) t=(t<<1)+(t<<3)+(c^48),c=getchar();
	return f*t;
}

int qiu(int x,int y){
	int res=0;
	if(x==y){
		for(int i=1;i<=ge;i++){
			if(a[i].size()==1&&a[i][0]==s[x]) res++;
		}
		return res;
	}
	string ss=s.substr(x,y-x+1);
	for(int i=1;i<=ge;i++){
		if(ss.find(a[i])==0) res++;
//		cout<<endl<<"x:"<<x<<" y:"<<y<<" i:"<<i<<" ss.find(a[i]):"<<ss.find(a[i])<<endl;
//		for(int j=0;j<ss.size();j++) cout<<ss[j];
//		cout<<endl;
	}
	return res;
}

int main(){
//	string aaa="aaa";
//	cout<<aaa.find("aaaa");
	p=read(),k=read();
	s="";
	for(int i=1;i<=p;i++){
		for(int j=(i-1)*20+1;j<=i*20;j++){
			char c;
			cin>>c;
			s=s+c;
		}
	}
//	for(int i=0;i<s.size();i++) cout<<s[i];
	ge=read();
	for(int i=1;i<=ge;i++) cin>>a[i];
	for(int i=s.size()-1;i>=0;i--){
		for(int j=i;j>=0;j--){
			d[j][i]=qiu(j,i)+d[j+1][i];
			dp[j][i][1]=d[j][i];
//			cout<<"i:"<<j<<" j:"<<i<<" dp[i][j][1]:"<<dp[j][i][1]<<endl; 
		}
	}
	for(int len=2;len<=k;len++){
		for(int zuo=0;zuo<=s.size()-len+1;zuo++){
			for(int you=s.size()-1;you>=zuo+len-1;you--){
//				dp[zuo][you][len]=dp[zuo][you][len-1];
				for(int i=you-1;i>=zuo+len-2;i--){
					dp[zuo][you][len]=max(dp[zuo][you][len],dp[zuo][i][len-1]+dp[i+1][you][1]);
				}
//				if(len==k) cout<<"zuo:"<<zuo<<" you:"<<you<<" len:"<<len<<" dp[zuo][you][len]:"<<dp[zuo][you][len]<<endl;
			}	
		}
	}
//	string ss=s.substr(15,17);
//	for(int i=0;i<ss.size();i++) cout<<ss[i];
	cout<<dp[0][s.size()-1][k]<<endl;
	return 0;
}
2023/9/23 18:33
加载中...