dp类模板

1、n串最长公共子序列

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int MAXF=1000005;
 6 const int MAXN=105;
 7 int n;
 8 int base[MAXN],len[MAXN],pos[MAXN];
 9 char ans;
10 char f[MAXF];
11 char word[MAXN][MAXN];
12 void solve()
13 {
14     int idx=0;
15     for(int i=0;i<n;i++){
16         idx+=(pos[i]-1)*base[i];
17     }
18     bool same=true,has_one=false;
19     for(int i=1;i<n;i++){
20         if(word[i][pos[i]-1]!=word[0][pos[0]-1]){
21             same=false;
22             break;
23         }
24         if(pos[i]==1){
25             has_one=true;
26         }
27     }
28     if(same){
29         if(has_one){
30             f[idx]=1;
31         }else{
32             int p_idx=idx;
33             for(int i=0;i<n;i++){
34                 p_idx-=base[i];
35             }
36             f[idx]=f[p_idx]+1;
37         }
38     }else{
39         for(int i=0;i<n;i++){
40             if(pos[i]==1) continue;
41             f[idx]=max(f[idx],f[idx-base[i]]);
42         }
43     }
44     ans=max(ans,f[idx]);
45 }
46 void dp(int p)
47 {
48     if(p==n){
49         return solve();
50     }
51     for(int i=1;i<=len[p];i++){
52         pos[p]=i;
53         dp(p+1);
54     }
55 }
56 int main(void)
57 {
58     scanf("%d",&n);
59     for(int i=0;i<n;i++){
60         scanf("%s",word[i]);
61         len[i]=strlen(word[i]);
62     }
63     base[0]=1;
64     for(int i=1;i<n;i++){
65         base[i]=base[i-1]*len[i-1];
66     }
67     dp(0);
68     printf("%d\n",ans);
69 }
70 /*
71 
72 3
73 Iloveyou
74 Ihateyou
75 Iwantyou 
76 
77 */
View Code

 

posted @ 2014-03-29 22:16  heaventouch  阅读(197)  评论(0编辑  收藏  举报