POJ 3267 The Cow Lexicon

解题思路:DP

opt[i]表示到i为止最少需要除去多少字符

  
    
opt[i] = min{opt[i - 1 ] + 1 ,opt[j] + i - j - len[k]};
( if msg[i] == word[k][len[k ]] && msg[j+1,i]包含word[k]);

 

NULL
   
     
#include < iostream >
using namespace std;

int main()
{
int i,j,k,t,w,r,l,len[ 600 ],opt[ 301 ] = { 0 };
char msg[ 301 ],word[ 600 ][ 26 ];
scanf(
" %d %d " , & w, & l);
scanf(
" %s " , msg);
for (i = 0 ;i < w;i ++ ){scanf( " %s " , word[i]);len[i] = strlen(word[i]);}
for (i = 1 ;i <= l;i ++ )
{
opt[i]
= opt[i - 1 ] + 1 ;
for (j = 0 ;j < w;j ++ )
{
if (i < len[j] || msg[i - 1 ] != word[j][len[j] - 1 ]) continue ;
for (k = i - 1 ,t = len[j] - 1 ;k >= 0 && t >= 0 && (i - k - len[j] + t) < opt[i];k -- )
if (msg[k] == word[j][t])t -- ;
r
= t < 0 ? (i - 1 - k - len[j]):i;
if (opt[k + 1 ] + r < opt[i])opt[i] = opt[k + 1 ] + r;
}
}
printf(
" %d\n " ,opt[l]);
return 0 ;
}

 

你可能感兴趣的:(icon)