题意:求最少去掉多少字母,能使句子可由单词表中的单词连成。
代码:
#include<iostream>
#include<fstream>
using namespace std;
char c[310];
char a[601][30];
int dp[301];
int n,m;
int ok(int s,int t){
int i,j,k;
j=strlen(a[t])-1;
for(i=s;j>=0&&i>=0;i--)
if(c[i]==a[t][j])
{
j--;
if(j==-1)
return i;
}
return -1;
}
void read(){
// ifstream cin("in.txt");
int i,j,k,s,t;
cin>>n>>m;
cin>>c;
k=30;
for(i=0;i<n;i++)
{
cin>>a[i];
j=strlen(a[i]);
k=min(k,j);
}
for(i=1;i<=m;i++)
dp[i]=i;
for(i=k;i<=m;i++)
{
for(j=0;j<n;j++)
if(i>=strlen(a[j]))
{
s=ok(i-1,j);
if(s!=-1)
{
int t=strlen(a[j]);
dp[i]=min(dp[i],dp[s]+i-t-s);
}
}
}
cout<<dp[m]<<endl;
}
int main(){
read();
return 0;
}