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 */