zoukankan      html  css  js  c++  java
  • BZOJ4275 : [ONTAK2015]Badania naukowe

    设f[i][j]为a[1..i]与b[1..j]的LCS,g[i][j]为a[i..n]与b[j..m]的LCS。

    若C为0,则ans=f[n][m]。

    否则求出d[i]=a中从i开始往右匹配上c串的位置以及e[i]=b中从i开始往右匹配上c串的位置。

    则ans=max(f[i-1][j-1]+g[d[i]+1][e[j]+1]+C)。

    时间复杂度$O(n^2)$。

    #include<cstdio>
    #define N 3010
    int n,m,C,i,j,k,a[N],b[N],c[N],f[N][N],g[N][N],d[N],e[N],ans=-1;
    inline int max(int a,int b){return a>b?a:b;}
    int main(){
      for(scanf("%d",&n),i=1;i<=n;i++)scanf("%d",&a[i]);
      for(scanf("%d",&m),i=1;i<=m;i++)scanf("%d",&b[i]);
      for(scanf("%d",&C),i=1;i<=C;i++)scanf("%d",&c[i]);
      for(i=1;i<=n;i++)for(j=1;j<=m;j++)f[i][j]=a[i]==b[j]?(f[i-1][j-1]+1):max(f[i-1][j],f[i][j-1]);
      if(!C)return printf("%d",f[n][m]),0;
      for(i=n;i;i--)for(j=m;j;j--)g[i][j]=a[i]==b[j]?(g[i+1][j+1]+1):max(g[i+1][j],g[i][j+1]);
      for(i=1;i<=n;i++)for(j=i,k=1;j<=n;j++){
        if(a[j]==c[k])k++;
        if(k>C){d[i]=j;break;}
      }
      for(i=1;i<=m;i++)for(j=i,k=1;j<=m;j++){
        if(b[j]==c[k])k++;
        if(k>C){e[i]=j;break;}
      }
      for(i=1;i<=n;i++)if(d[i])for(j=1;j<=m;j++)if(e[j])ans=max(ans,f[i-1][j-1]+g[d[i]+1][e[j]+1]+C);
      return printf("%d",ans),0;
    }
    

      

  • 相关阅读:
    类的设计问题
    php数组存在重复的相反元素,去重复
    常用JS验证函数总结
    python常用模块
    re 模块
    logging 模块
    configparser模块
    python 文件处理
    第15章-输入/输出 --- 理解Java的IO流
    第10章-验证框架 --- 验证器类型
  • 原文地址:https://www.cnblogs.com/clrs97/p/4849418.html
Copyright © 2011-2022 走看看