3267 不能匹配就跳过

#include <iostream>
#include <stdio.h>
#include <cstring>
#define L 310
#define W 610
using namespace std;
char b[W][L],a[L];
int c[W],lena,lenb,dp[L];
int main()
{
int i,w,m,k,j;
scanf("%d %d",&w,&lena);
scanf("%s",a);
for(i=0;i<w;i++)
{scanf("%s",b[i]);c[i]=strlen(b[i]);}
for (i=1;i<=lena;i++)
{
dp[i]=dp[i-1]+1;    //dp[i]表示前i个字符中需要删除的字符的个数
for (m=0;m<w;m++)
{
k=c[m]-1;
for (j=i-1;j>=0 && k>=0;j--)     
if (a[j]==b[m][k])
k--;
if (k<0)
dp[i]=min(dp[i],dp[j+1]+i-1-j-c[m]);    //i-1为j的初值,i-1-j为j走过的长度,而c[m]为模式串的长度,相减即为要删除的字符的个数
}
}
cout<<dp[lena]<<endl;
return 0;
}

posted @ 2013-11-08 22:04  单调的幸福  阅读(179)  评论(0编辑  收藏  举报