zoukankan      html  css  js  c++  java
  • LCIS(最长公共上升子序列)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int m,n,ans,a[501],b[501],dp[501][501],pre[501][501],lcis[501];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
            scanf("%d",&b[i]);
        for(int i=1;i<=n;i++)
        {
            int k=0;//dp[i][k]为最长的前缀公共上升子序列 
            for(int j=1;j<=m;j++)
            {
                if(a[i]!=b[j])
                    dp[i][j]=dp[i-1][j];
                if(a[i]>b[j]&&dp[i][j]>dp[i][k])
                    k=j;
                if(a[i]==b[j])
                {
                    dp[i][j]=dp[i][k]+1;
                    pre[i][j]=k;//方便寻找dp[i][j]的前一位 
                }     
            }
        }
        int x=n,y=0,cnt=0;
        for(int i=1;i<=m;i++)
            if(dp[n][i]>ans)
            {
                ans=dp[n][i];
                y=i;
            }
        while(dp[x][y])
        {
            if(a[x]!=b[y])
                x--;
            else
            {
                lcis[ans-cnt]=b[y];
                cnt++;
                y=pre[x][y];//表示回溯到推出dp[x][y]的上一位 
            }
        }
        printf("%d
    ",ans);
        for(int i=1;i<=ans;i++)
            printf("%d ",lcis[i]); 
        printf("
    ");
         return 0;
    }
  • 相关阅读:
    JS 提交表单
    [ZJOI 2010]base 基站选址
    [ZJOI 2013]丽洁体
    [Codeforces 176B]Word Cut
    [SDOI 2013]方程
    [AtCoder agc021D]Reversed LCS
    [BZOJ 4361]isn
    [SDOI 2011]黑白棋
    [ZJOI 2010]Perm 排列计数
    [Codeforces 297E]Mystic Carvings
  • 原文地址:https://www.cnblogs.com/water-radish/p/9280677.html
Copyright © 2011-2022 走看看