码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3267

时间:2017-09-10 09:58:00      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:++   problem   情况   代码   namespace   思路   blog   logs   clu   

题目链接:http://poj.org/problem?id=3267

解题思路:

  思路来源于网络!惭愧惭愧!

     先dp[L] = 0。用一个循环 for(int i = L-1; i>=0; i--) 从后往前遍历 message 中的每一个字符,对于每一个 i,先让 dp[i] = dp[i+1] +1(先假设最坏的情况:在遍历到这个字符的时候无法找到匹配的字符串),然后依次遍历给出的“牛典”里面的W个单词,如果能够匹配(在 message 字符串结束之前能够找齐这个单词中的所有字母)(假设此时对于message遍历到 k),那么更新 dp[i] = min(dp[i], k-i+1-len_of_word+dp[k+1])。差不多就这样了。

AC代码:

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int maxn=600+3;
 6 char words[maxn][30];
 7 int len[maxn],dp[303];
 8 char temp[303];
 9 int main(){
10     int W,L;
11     scanf("%d%d",&W,&L);
12     scanf("%s",temp);
13     for(int i=0;i<W;i++){
14         scanf("%s",words[i]);
15         len[i]=strlen(words[i]);
16     }
17     dp[L]=0;
18     for(int i=L-1;i>=0;i--){
19         dp[i]=dp[i+1]+1;
20         for(int j=0;j<W;j++){
21             if(L-i>=len[j]){
22                 int ind=0;
23                 int k=i;
24                 for(;k<L;k++){
25                     if(temp[k]==words[j][ind]){
26                         ind++;
27                         if(ind==len[j]) break;
28                     }
29                 }
30                 if(ind==len[j])
31                     dp[i]=min(dp[i],k-i+1-len[j]+dp[k+1]);
32             }
33         }
34     }
35     printf("%d\n",dp[0]);
36     return 0;
37 }

 

POJ3267

标签:++   problem   情况   代码   namespace   思路   blog   logs   clu   

原文地址:http://www.cnblogs.com/Blogggggg/p/7499976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!