zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    69 }
    70 /*
    71 
    72 3
    73 Iloveyou
    74 Ihateyou
    75 Iwantyou 
    76 
    77 */
    View Code
  • 相关阅读:
    ssh登录
    wireless tools的使用
    Ubuntu中的minicom
    ubuntu 下交叉编译环境的搭建
    两个队列实现一个栈
    二叉树节点的插入
    二叉树的非递归遍历
    acwing 66. 两个链表的第一个公共结点
    acwing 60. 礼物的最大价值
    acwing 55. 连续子数组的最大和
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3633180.html
Copyright © 2011-2022 走看看