LIS,LCS,LCIS

简介: LIS,LCS,LCIS

LIS(最长上升子序列)

#include<iostream>
using namespace std;
int a[1100],dp[1100],ans,n;
int main() {
  cin>>n;
  for(int i=1; i<=n; i++) {
    cin>>a[i];
    dp[i]=1;//初始状态
  }
  ans=1;
  for(int i=1; i<=n; i++) {
    for(int j=1; j<=i; j++) {
      if(a[j]<a[i]) {
        dp[i]=max(dp[i],dp[j]+1);//状态转移
        ans=max(ans,dp[i]);
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}

LIS(最长上升子序列)

#include<iostream>
using namespace std;
int a[1100],dp[1100],ans,n;
int main() {
  cin>>n;
  for(int i=1; i<=n; i++) {
    cin>>a[i];
    dp[i]=1;//初始状态
  }
  ans=1;
  for(int i=1; i<=n; i++) {
    for(int j=1; j<=i; j++) {
      if(a[j]<a[i]) {
        dp[i]=max(dp[i],dp[j]+1);//状态转移
        ans=max(ans,dp[i]);
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}

LCIS(最长公共上升子序列)

#include<iostream>
#include<string.h>
using namespace std;
const int N=1010;
int n,m;
int a[N],b[N];
int f[N][N];
int main() {
  int t;
  cin>>t;
  while(t--) {
    memset(f,0,sizeof(f));
    cin>>n;for(int i=1;i<=n;i++)cin>>a[i];
    cin>>m;for(int i=1;i<=m;i++)cin>>b[i];
    for(int i=1; i<=n; i++) {
      int maxv=1;
      for(int j=1; j<=m; j++) {
        f[i][j]=f[i-1][j];
        if(a[i]==b[j])
          f[i][j]=max(f[i][j],maxv);
        if(b[j]<a[i])
          maxv=max(maxv,f[i-1][j]+1);
      }
    }
    int res=0;
    for(int i=1;i<=m;i++){
      res=max(res,f[n][i]);
    }
    cout<<res<<endl;
    if(t!=0){
      cout<<endl;
    }
  }
}
目录
相关文章
PTA 7-5 子串与子列 (25 分)
子串是一个字符串中连续的一部分,而子列是字符串中保持字符顺序的一个子集,可以连续也可以不连续。
110 0
UPC——Swap (LCS转为LIS)
UPC——Swap (LCS转为LIS)
74 0
UPC——Swap (LCS转为LIS)
|
算法 PHP Python
最长公共子串- LCS 算法
最长公共子串- LCS 算法
71 0
|
存储 人工智能
【动态规划】LIS最长上升子序列【入门】
【动态规划】LIS最长上升子序列【入门】
78 0
|
机器学习/深度学习 算法 Java
【每日算法】详解为何能从 LCS 问题转化为 LIS 问题,以及 LIS 贪心解的正确性证明 |Python 主题月
【每日算法】详解为何能从 LCS 问题转化为 LIS 问题,以及 LIS 贪心解的正确性证明 |Python 主题月
【LeetCode300】最长递增子序列LIS(dp)
(1)确定状态 d p [ i ] dp[i]dp[i]表示以nums[i]为结尾的最长递增子序列长度(和最大连续子问题一样,以nums[i]结尾是强制的要求)。 (2)状态转移方程
94 0
【LeetCode300】最长递增子序列LIS(dp)