参考了大佬题解中string的基操
#include<cstdio>
#include<iostream>
using namespace std;
string str,ch,word[10];
int p,k,s,sum[510][510],dp[510][50];
bool Find(int l,int r)
{
string aim=str.substr(l,r-l+1);
for(int i=1;i<=s;i++)
if(aim.find(word[i])==0)return 1;
return 0;
}
int main()
{
//freopen("in.txt","r",stdin);
cin>>p>>k;str+='0';
for(int i=1;i<=p;i++)
cin>>ch,str+=ch;
int len=str.length()-1;
cin>>s;
for(int i=1;i<=s;i++)
cin>>word[i];
for(int j=len;j;j--)
for(int i=j;i;i--)
{
sum[i][j]=sum[i+1][j];
if(Find(i,j))sum[i][j]++;
}
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++)
dp[i][1]=sum[1][i];
for(int i=1;i<=len;i++)
for(int j=1;j<i&&j<=k;j++)
for(int l=j;l<i;l++)
dp[i][j]=max(dp[i][j],dp[l][j-1]+sum[l+1][i]);
cout<<dp[len][k]<<endl;
}
总结
基操,皆坐,勿6