标签:++ 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 }
标签:++ problem 情况 代码 namespace 思路 blog logs clu
原文地址:http://www.cnblogs.com/Blogggggg/p/7499976.html