The Cow Lexicon(dp)

http://poj.org/problem?id=3267

题意:给出一个主串,一些单词,匹配这些单词,问至少要删除多少字符。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <math.h>
 4 #include <cstring>
 5 #include <string>
 6 int dp[350];//dp[i]表示i->L删除的字符数
 7 using namespace std;
 8 int main()
 9 {
10     int n,L;
11     string word[606],s;
12     cin>>n>>L;
13     cin>>s;
14     for (int i = 0; i < n; i ++)
15         cin>>word[i];
16     dp[L] = 0;
17     for (int i = L-1; i >= 0; --i)
18     {
19         dp[i] = dp[i+1]+1;//单词序列在主串中不匹配的情况
20         for (int k = 0; k < n; k ++)
21         {
22             int len = word[k].length();
23             if (len <=L-i && word[k][0]==s[i])//单词长度小于等于匹配长度并且与单词的第一个字母相同
24             {
25                 int ps = i;//指示主串的指针
26                 int pw = 0;//指示单词指针
27                 while(ps < L)
28                 {
29                     if (word[k][pw]==s[ps])//如果匹配相同,主串指针和单词指针都移动
30                         ++pw;
31                     ++ps;//如果匹配不相同,只是主串指针移动
32                     if (pw >= len)//单词匹配成功,更新
33                     {
34                         dp[i] = min(dp[i],dp[ps]+(ps-i)-len);//ps-i-len表示从i->ps要删除的字符数
35                                                              //dp[ps]表示从ps->L要删除的字符数,两者相加便是
36                                                              //从i->L要删除的字符数,这个值一定<=dp[i]
37                     }
38                 }
39             }
40 
41         }
42     }
43     cout<<dp[0]<<endl;
44     return 0;
45 }
View Code
原文地址:https://www.cnblogs.com/lahblogs/p/3355126.html