您的位置:首页 > 其它

USACO Section 2.3 The Longest Prefix - 一点点DP思想

2011-11-28 13:55 323 查看
题目的意思是给出好一些单词...再给一个长串(多行的接成一行)..问由这些单词一个一个接着一个(可重复)最长能组成所给字符串的前缀...

有点01背包的思想...用一个bool数组来记录字符串的某个位置能否被拓展到..并且在更新拓展位置时同样也是以前面已经拓展的点来看后面(枚举所有的单词,看能拓展到后面那哪些点)..因为所给的单词最长也就10..所以总的来看这种方法效率还是可以接受了.



Program:

/*  
ID: zzyzzy12  
LANG: C++  
TASK: prefix
*/    
#include<iostream>    
#include<stdio.h>    
#include<string.h>    
#include<math.h>    
#include<algorithm>    
#include<queue>
using namespace std;   
string s,a[205];
bool g[300002];
char str[81];
int num,k,i,j,len,l[205],ans;
int main()
{
     freopen("prefix.in","r",stdin);
     freopen("prefix.out","w",stdout);  
     num=0;
     scanf("%s",str);
     while (str[0]!='.')
     {
           a[++num]=str;
           l[num]=strlen(str);
           scanf("%s",str);
     }
     s="";
     while (~scanf("%s",str)) s+=str;
     len=s.length();
     memset(g,false,sizeof(g)); 
     g[0]=true;
     for (k=0;k<=len;k++)
     if (g[k])
     { 
            ans=k;
            for (i=1;i<=num;i++)
            if (k+l[i]<=len)
            { 
                   for (j=0;j<l[i];j++)
                      if (s[k+j]!=a[i][j]) goto A;        
                   g[k+l[i]]=true; 
                   A: ;
            }
     } 
     printf("%d\n",ans);
     return 0;   
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: