题目大意:
给你w个标准字符串(2-600) 以及长度为l(2-300)的一个目标字符串,问你至少要给该目标字符串删除多少个字符,才能分割成这些标准字符串。

思路:
一开始一点思路也没有,只能猜到是dp,然后这道题就一直闲置下来了,后来把寒假dp训练专题都做了一遍,然后回来又看这道题,开始有一点思路了。

dp建立:设a[i]为以目标字符串第i个字符结尾的子串至少需要删除a[i]个字符。
递推公式(文字描述):
关于第i+1个字符,有两种处理方法,第一种就是删除,这时,a[i+1]=min{a[j]+i-j};第二种就是不删,此时找出所有以字符v[i+1]结尾的标准字符串,然后分别在目标字符串中去除这些字符串(相同的字符抵消,不同的在目标字符串中删除),并记录删除了多少个不相同的字符x[j]。此时,a[i+1]=min{a[t]+x[j]} 。
边界条件:a[1]=1;

#include
#include
#include
#include
#define W 700
#define N 350
using namespace std;
int m,n;//m个标准字符串,目标字符串有n个字符 
char w[N]={0};
char k[W][30]={0};
int a[N]={0};

void input()
{
	char l;
	cin>>m>>n;
	l=getchar();
	for(int i=1;i<=n;i++)
	{
		scanf("%c",&w[i]);
	}
	l=getchar();
	for(int i=1;i<=m;i++)
	{
		scanf("%s",k[i]);
	}
}

void init()
{
	for(int i=0;i<=n;i++)
	{
		a[i]=i;
	}
} 

void dp()
{
	init();
	for(int i=1;i<=n;i++)
	{
		for(int j=0;ja[j]+i-j)a[i]=a[j]+i-j; } for(int j=1;j<=m;j++) { if(w[i]!=k[j][strlen(k[j])-1])continue; if(i=1;l--)//从目标字符串的第i个开始减 { if(w[l]==k[j][t]) { //if(i==5)cout<a[p]+s)a[i]=a[p]+s; } } } } void ceshi1() { for(int i=1;i<=n;i++) cout<