最长上升子序列 and 最长公共子序列 问题模板

 两种求最长上升子序列问题

第一种:定义dp[i]=以a[i]为末尾的最长上升子序列问题的长度

第二种:定义dp[i]=长度为i+1的上升 子序列 中末尾元素的最小值

#include <cstdio>
#include <iostream>
using namespace std;
const int INF = 0x3f3f3f3f;
int dp[100];
int n=5;
int a[]={4,2,3,1,5};

void LISone()
{
    int res = 0;
    for(int i=0;i<n;i++){
        dp[i]=1;
        for(int j=0;j<i;j++)
            if(a[j]<a[i])
                dp[i]=max(dp[i],dp[j]+1);
        res = max(res,dp[i]);
    }
     cout<<res<<endl;
}
void LIStwo()
{
    fill(dp,dp+n,INF);
    for(int i=0;i<n;i++)
        *lower_bound(dp,dp+n,a[i])=a[i];
    cout<<lower_bound(dp,dp+n,INF)-dp;
}
int main()
{
    LISone();
    LIStwo();
    return  0;
}

最长公共子序列

#include <cstdio>
#include <iostream>
using namespace std;
int dp[100][100];
char s[100],t[100];
int n,m;
void LCS()
{
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(s[i]==t[j])
                dp[i+1][j+1]=dp[i][j]+1;
            else
                dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
        }
    }
    cout<<dp[n][m]<<endl;
}
int main()
{
    cin>>n>>m;
    cin>>s>>t;
    LCS();
    return  0;
}
原文地址:https://www.cnblogs.com/qie-wei/p/10160163.html