POJ3267

题目链接: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
",dp[0]);
36     return 0;
37 }
“这些年我一直提醒自己一件事情,千万不要自己感动自己。大部分人看似的努力,不过是愚蠢导致的。什么熬夜看书到天亮,连续几天只睡几小时,多久没放假了,如果这些东西也值得夸耀,那么富士康流水线上任何一个人都比你努力多了。人难免天生有自怜的情绪,唯有时刻保持清醒,才能看清真正的价值在哪里。”
原文地址:https://www.cnblogs.com/Blogggggg/p/7499976.html