首页 > 其他分享 >最长上升子序列(LIS)

最长上升子序列(LIS)

时间:2022-09-25 19:56:45浏览次数:59  
标签:int LIS 序列 include 最长 1001

题目:

LIS (Longest Increasing Subsequence)为最长上升子序列:
给定n个元素的数列,求最长的上升子序列长度(LIS)。

一个数的序列ai,当a1 < a2 < … < aS的时候,我们称这个序列是上升的。
比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).
对于给定的序列,求出最长上升子序列的长度。

输入

输入包含两行,第一行只有一个整数N(1 <= N <= 1000),表示数列的长度。第二行有N个自然数ai,0 <= ai <= 1000,两个数之间用空格隔开。

输出

输出只有一行,包含一个整数,表示最长上升子序列的长度。

1.暴力搜索

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1001];

int dfs(int i)
{
    int s=0;
    for(int j=i+1;j<=n;j++)
      if(a[i]<a[j]) s=max(s,dfs(j));
    s++;
    return s;
}
int main()
{
    int ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,dfs(i));
    }
    cout<<ans<<endl;
}

2.倒序递推求f[i]

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1001],f[1001];

int main()
{
    int ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
     f[n]=1;
    for(int i=n-1;i>=1;i--)
    {
        f[i]=0;
        for(int j=1+i;j<=n;j++)
          if(a[i]<a[j]) f[i]=max(f[i],f[j]);
        f[i]++;
    }

    for(int i=1;i<=n;i++)
      ans=max(ans,f[i]);
    cout<<ans<<endl;
    return 0;
}

3.记忆化搜索

#include<iostream>
#include<cstdio>
using namespace std;
int n,a[1001],f[1001];

int dfs(int i)
{
    if(f[i]>0) return f[i];
    f[i]=0;
    int s=0;
    for(int j=i+1;j<=n;j++)
      if(a[i]<a[j]) f[i]=max(f[i],dfs(j));
    f[i]++;
    return f[i];
}
int main()
{
    int ans=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
    for(int i=1;i<=n;i++)
    {
        ans=max(ans,dfs(i));
    }
    cout<<ans<<endl;
}

 

标签:int,LIS,序列,include,最长,1001
From: https://www.cnblogs.com/xdzxlsy/p/16728636.html

相关文章

  • PHP序列化基础知识
    魔术方法:注:魔术方法只有在类中被定义以后才可以触发PHP将所有以__(两个下划线)开头的类方法保留为魔术方法,这些都是PHP内置的方法。__construct()当一个对象创建时被......
  • 序列
    实验 项目名称:      序列的应用               一.   实验目的和要求 初步认识序列二.  实验环境 win10三.  实验过......
  • 代码阅读题-subList()
    publicstaticvoidmain(String[]args){List<String>allElements=List.of("a","b","c","d","e","f");List<String>allList=newArrayList......
  • K8s 网络插件 Calico 报错:Number of node(s) with BGP peering established = 0
    问题现象calico对应的Pod启动失败,报错:Numberofnode(s)withBGPpeeringestablished=0问题分析Calico提供了IP自动检测的方法,默认是使用第一个有效网卡上......
  • Stop Learning English Words by ROTE - guner
    英语单词的最高境界就是不背单词/?来自一本魔性的书,书的作者自称“枪哥”虽然slogan是这样但是实际上书中介绍了一些有关于单词和中文的区别与类同用词根词缀的方式去演......
  • 011——常用API(String , ArrayList)
    常用API(String,ArrayList)API(ApplicationProgrammingInterface,应用程序编程接口)Java写好的程序(功能),咱们可以直接调用。Oracle也为Java提供的这些功能代码......
  • 集合ArrayList类
    什么是集合集合是长度可变的容器集合与数组的对比集合长度可变,自动伸缩,可长可短集合只能存引用数据类型,非要存基本数据类型,就要将其变成包装类ArrayListArrayList......
  • 4 Englishi 词根
    11-ism N词后缀  ...主义; 流派; 特性individualism captitalismmodernismhumanism 12-istN词后缀 人;...家artistcommunistscientist 13-ive ......
  • CSP2021括号序列
    [CSP-S2021]括号序列题目描述小w在赛场上遇到了这样一个题:一个长度为\(n\)且符合规范的括号序列,其有些位置已经确定了,有些位置尚未确定,求这样的括号序列一共有多少......
  • 【Chrome插件 Chrome extension 】报错 Unchecked runtime.lastError: Could not esta
    问题:【Chrome插件Chromeextension】报错Uncheckedruntime.lastError:Couldnotestablishconnection.Receivingenddoesnotexist.在看一个别人插件的时候发现......