poj3267

题意:问母串中至少去掉多少个字母才能是刚好由单词表中的一些单词连接而成的。

分析:dp,f[i]表示母串从第i位起始的后缀所对应的最少去掉字母数。

f[i]有两种选择f[i + 1] + 1或者f[i + num] + num - strlen(word[j])。其中num是从第i位开始匹配word[j]所需要的母串从i位起始的后缀的前缀的长度。

View Code
#include < iostream >
#include
< cstdio >
#include
< cstdlib >
#include
< cstring >
using namespace std;

#define maxn 605
#define maxl 305

int n, m;
char st[maxl], word[maxn][maxl];
int f[maxl];

int match( char * st1, char * st2)
{
if (st1[ 0 ] != st2[ 0 ])
return 0 ;
int len = strlen(st2);
int j = 0 ;
for ( int i = 0 ; i < len; i ++ )
{
while (st1[j] != ' \0 ' && st1[j] != st2[i])
j
++ ;
if (st1[j] == ' \0 ' )
return 0 ;
j
++ ;
}
return j;
}

int main()
{
// freopen("t.txt", "r", stdin);
scanf( " %d%d " , & n, & m);
scanf(
" %s " , st);
int num;
for ( int i = 0 ; i < n; i ++ )
scanf(
" %s " , word[i]);
f[m]
= 0 ;
for ( int i = m - 1 ; i >= 0 ; i -- )
{
f[i]
= f[i + 1 ] + 1 ;
for ( int j = 0 ; j < n; j ++ )
if (num = match( & st[i], word[j]))
f[i]
= min(f[i], int (num - strlen(word[j]) + f[i + num]));
}
printf(
" %d\n " , f[ 0 ]);
return 0 ;
}

你可能感兴趣的:(poj)