好吧,虽然很多人说这是很简单的DP题,但是对我来说还是蛮难的,从一开始的递归超时,到后来的DP超内存,再到后来的DP爆栈,直到现在才过。不过我知道这道题可以有很多种dp方法,还可以加上HASH,可以提速,不管怎么说,DP果然还是要更近一步啊!下面贴代码,以作纪念.

View Code
 1 /*{
 2 ID:jzy3209981
 3 PROG:prefix
 4 LANG:C++
 5 }*/
 6 #include<stdio.h>
 7 #include<iostream>
 8 #include<string.h>
 9 #include<math.h>
10 using namespace std;
11 
12 int dp[200001];
13 char original[201][11];
14 char sequence[200001];
15 char buffer[100];
16 
17 int DP(int i,int n)
18 {
19     int p=0,j=0,max=0,temp;
20     while(p<n)
21     {
22         while(original[p][j]!=NULL&&sequence[i+j]!=NULL)
23         {
24             if(original[p][j]!=sequence[i+j])
25                 break;
26             j++;
27         }
28         if(original[p][j]==NULL&&sequence[i+j-1]!=NULL)
29         {        
30             temp=dp[j+i]+j;
31             if(temp>max)
32                 max=temp;
33         }
34         j=0;
35         p++;
36     }
37     return max;
38 }
39 int main()
40 {
41     freopen ("prefix.in","r",stdin);
42     freopen ("prefix.out","w",stdout);
43     int n=0,i,s;
44     scanf("%s",original[n]);
45     while(original[n][0]!='.')
46     {
47         n++;
48         scanf("%s",original[n]);
49     }
50     while(scanf("%s",buffer)!=EOF)
51         strcat(sequence,buffer);
52     s=strlen(sequence);
53     for(i=s-1;i>=0;i--)
54         dp[i]=DP(i,n);
55     printf("%d\n",dp[0]);
56     return 0;
57 }

 

 

posted on 2012-07-28 15:18  醉春雨  阅读(196)  评论(0)    收藏  举报