好吧,虽然很多人说这是很简单的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 }

浙公网安备 33010602011771号