[luogu CF10D] LCIS{最长公共上升子序列}

题目

https://www.luogu.org/problemnew/show/CF10D


结题思路

这道题与tyvj 1071唯一的区别在于:
1. 有多组数据
2. 需要递归输出方案

怎样递归输出方案呢?
可以用一个 t[i][j] t [ i ] [ j ] 来储存每次的值, t[i][j]=val//t[i1][j] t [ i ] [ j ] = v a l / / t [ i − 1 ] [ j ]


代码

#include
#include
#define rep(i,x,y) for (register int i=x;i<=y;i++)
using namespace std; 
int n,m,q,a[4001],b[4001],f[4001][4001],t[4001][4001]; 
void prin(int q)
{if (!q) return; prin(t[n][q]); printf("%d ",b[q]);}
int main()
{
    scanf("%d",&n); 
    rep(i,1,n) scanf("%d",&a[i]); 
    scanf("%d",&m); 
    rep(i,1,m) scanf("%d",&b[i]); 
    rep(i,1,n)
    {
        int val=0; 
        rep(j,1,m){
            f[i][j]=f[i-1][j]; t[i][j]=t[i-1][j]; 
            if (a[i]==b[j]&&f[i-1][val]+1>f[i][j]) f[i][j]=f[i-1][val]+1,t[i][j]=val;
            if (b[j]f[i-1][val]) val=j; 
        }
    }
    rep(i,1,m) if (f[n][i]>f[n][q]) q=i; 
    printf("%d\n",f[n][q]);
    prin(q); 
}

你可能感兴趣的:([序列]LIS/LCS,动态规划(/线性DP))