/*每天一个dp题,坚持下去你就是高手*/
/*首先这道题是采用逐个匹配*/
/*转移方程
dp[t-1] = min(dp[i-1]+t-i-x,dp[t-1]);
dp[i] = min(dp[i-1]+1,dp[i]);
*/
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
char str[10000],dir[1000][100];
int dp[10000];
int main()
{
int n,m;
while(cin>>n>>m)
{
memset(dp,0,sizeof(dp));
cin>>str+1;
for (int i=1;i<=n;i++)
{
cin>>dir[i];
}
dp[0] = 0;
for(int i=1;i<=m;i++)
dp[i] = dp[i-1] + 1;
for (int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(str[i] == dir[j][0])
{
int t = i ,x = 0;
while(t<=m)
{
if(str[t++] == dir[j][x])
x++;
if(x == strlen(dir[j]))
{
dp[t-1] = min(dp[i-1]+t-i-x,dp[t-1]);
break;
}
}
}
}
dp[i] = min(dp[i-1]+1,dp[i]);
}
// for(int i=1;i<=m;i++)
// cout<<dp[i]<<" ";
cout<<dp[m]<<endl;
}
}
poj 3267 简单dp
最新推荐文章于 2017-08-18 10:34:14 发布