LIS和LCS模板

//LIS模板,最长上升子序列 

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define For(a,b) for(int a=0;a<b;a++)
#define mem(x) memset(x,0,sizeof(x))
#define Debug(x) cout<<"---> "<<x<<endl;
#define sf scanf
#define pf printf
#define maxn 30010
int gcd(int a,int b){ return b>0?gcd(b,a%b):a;}
typedef long long ll;
typedef pair<int ,int > P;

//head
int n,A[maxn],dp[maxn],res=0;
int main(){
    cin>>n;
    For(i,n) cin>>A[i];
    for(int i=0;i<n;i++){
        dp[i]=1;
        for(int j=0;j<i;j++){
            if(A[i]>A[j]){
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
        res=max(res,dp[i]);
    }
    cout<<res<<endl;
    return 0;
}
//LCS模板,最长公共子序列 

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define For(a,b) for(int a=0;a<b;a++)
#define mem(x) memset(x,0,sizeof(x))
#define Debug(x) cout<<"---> "<<x<<endl;
#define sf scanf
#define pf printf
#define maxn 3010
int gcd(int a,int b){ return b>0?gcd(b,a%b):a;}
typedef long long ll;
typedef pair<int ,int > P;
//head
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int main(){
    //dp[i][j]表示si结尾,s2以sj结尾最长公共序列的长度
    cin>>s1>>s2;
    int len1=strlen(s1),len2=strlen(s2);
    for(int i=0;i<len1;i++){
        for(int j=0;j<len2;j++){
            if(s1[i]==s2[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[len1][len2]<<endl;
    return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_37360631/article/details/81348631