网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

c++如何解决最长上升子序列和公共子序列问题

今天小编给大家分享一下c++如何解决最长上升子序列和公共子序列问题的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

创新互联建站-专业网站定制、快速模板网站建设、高性价比紫云网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式紫云网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖紫云地区。费用合理售后完善,十载实体公司更值得信赖。

最长上升子序列

描述

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1a2, ..., aN),我们可以得到一些上升的子序列(ai1ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

输入

输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

输出

最长上升子序列的长度。

样例输入

7
1 7 3 5 9 4 8

样例输出

4

题解如下

#include
#include
#include
#include
using namespace std;
int n;
int a[100005];
int ans=0;
int dis[100005];
int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>a[i];
  }
  ans=0;
  dis[1]=0;
  for(int i=1;i<=n;i++){
    for(int j=1;j<=i;j++){//j永远不会超过i
      if(a[i]>a[j]){
        dis[i]=max(dis[i],dis[j]);//状态转移
      }
    }
    ans=max(ans,++dis[i]);
  }
  cout<

c++如何解决最长上升子序列和公共子序列问题

公共子序列

描述

我们称序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。

现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。

输入

输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。

输出

对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。

样例输入

abcfbc         abfcab
programming    contest 
abcd           mnp

样例输出

4
2
0

题解如下

#include
#include
#include
#include
using namespace std;
char a[10005],b[10005];
int ans[505][505];
int main(){
  while(cin>>a+1>>b+1){
    memset(ans,0,sizeof(ans));
    int x=strlen(a+1);
    int y=strlen(b+1);
    for(int i=1;i<=x;i++){
      for(int j=1;j<=y;j++){
        if(a[i]==b[j]){
          ans[i][j]=ans[i-1][j-1]+1;//注意,i-1和j-1不是代表上一位,而是这一位前最大的值
        }else{
          ans[i][j]=max(ans[i][j-1],ans[i-1][j]);
        }
      }
    }
    cout<

以上就是“c++如何解决最长上升子序列和公共子序列问题”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注创新互联行业资讯频道。


分享标题:c++如何解决最长上升子序列和公共子序列问题
当前路径:http://bjjierui.cn/article/ghjcei.html

其他资讯