求调
查看原帖
求调
1251525
wisdom2010楼主2025/1/19 12:52
#include<bits/stdc++.h>
using namespace std;
int p, k;
string s;
int n;
const int maxn = 200 + 10;
const int maxm = 40 + 10;
int dp[maxn][maxm];
int sum[maxn][maxn];
string m[10];//字典中单词 
int len;//字符串长度 
bool check(int l, int r)
{
	string st = s.substr(l, r - l + 1);
	for(int i = 1; i <= n; i++)
		if(st.find(m[i]) == 0)//寻找有没有以s[l]为开头的字符串 
			return true;
	return false;
}
void find()//预处理sum[][] 
{
	for(int i = len; i >= 1; i--)
	{
		for(int j = i; j >= 1; j--)
		{
			sum[j][i] = sum[j + 1][i];
			if(check(j, i) == true)
				sum[j][i]++;
		}
	}
}
void ans()
{
	dp[0][0] = 0;
	for(int i = 1; i <= len; i++)//初始化 
	{
		dp[i][1] = sum[1][i];
	}
	for(int i = 1; i <= k; i++)//初始化 
	{
		dp[i][i] = dp[i - 1][i - 1] + sum[i][i];
	}
	for(int i = 1; i <= len; i++)
	{
		for(int j = 1; j <= k && j < i; j--)
		{
			for(int l = j; l < i; l++)
			{
				dp[i][j] = max(dp[i][j], dp[l][j - 1] + sum[l + 1][i]);
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> p >> k;
	s += '0';
	for(int i = 0; i < p; i++)
	{
		string st;
		cin >> st;
		s += st;
	}
	cin >> n;//字典中单词个数 
	for(int i = 1; i <= n; i++)
	{
		cin >> m[i];
	}
	len = s.size() - 1;//开头有'0',s从0开始 
	find();
	ans();
	cout << dp[len][k];
	return 0;
}
2025/1/19 12:52
加载中...