字符串的动态规划,就是给你一个字典和一个序列,看这个序列能不能通过删除几个字母来做到全由字典中的字符串组成,问你最少需要删除几个。
类似于最长上升子序列,假设DP[i]表示前I个字符最小的操作
不匹配的时候,DP[i]=DP[I+1]+1
匹配的时候 创建一个pm代表序列中的标号,pd表示字典中的字符串中字符位置,很显然当我们的pd==字典中字符串长度的时候,是已经找完了的,那么此时字典的字符串中字符和序列中匹配的个数就应该是pm-pd-i
同理不匹配的话就应该是pm-i-字典的字符串的长度就是
DP[i]=dp[pm]+pm-i-length;
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
string dic[666];
string message;
int w,l;
int dp[333]={0};
int main()
{
cin>>w>>l;
cin>>message;
for(int i=0;i<w;i++)
cin>>dic[i];
for(int i=message.length()-1;i>=0;--i)
{
dp[i]=dp[i+1]+1;
for(int j=0;j<w;j++)
{
if(dic[j].length()<=message.length()&&dic[j][0]==message[i])
{
int pm=i,pd=0;
while(pm<message.length())
{
if(dic[j][pd]==message[pm])
pd++;
pm++;
if(pd==dic[j].length())
{
int temp=dp[pm]+pm-i-dic[j].length();
dp[i]=min(dp[i],temp);
}
}
}
}
}
cout<<dp[0]<<endl;
return 0;
}