首页 > 其他分享 >最长不下降子序列

最长不下降子序列

时间:2022-09-25 20:00:56浏览次数:55  
标签:cout int dfs 下降 ans 序列 include 最长 1001

题目:

设有由n(1≤n≤200))个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)b(1)、b(2)、……、b(n)若存在i1<i2<i3<…<ie 且有b(i1)<=b(i2)<=…<=b(ie)则称为长度为e的不下降序列。程序要求,当原数列出之后,求出最长的不下降序列。

例如13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中13,16,18,19,21,22,63就是一个长度为7的不下降序列,同时也有7 ,9,16,18,19,21,22,63组成的长度为8的不下降序列。

输入

第一行为n,第二行为用空格隔开的n个整数。

输出

第一行为输出最大个数max(形式见样例);

第二行为max个整数形成的不下降序列,答案可能不唯一,输出一种就可以了。

1.

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

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

2.优化

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

void dfs(int i)
{
    if(f[i]>0) dfs(f[i]);
    cout<<a[i]<<" ";
}

int main()
{//hello hello~
    int n,k;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];        
     } 
    f[1]=a[1];
    int ans=f[1];
    cnt=1;
    for(int i=2;i<=n;i++)
    {
        int l=1,r=cnt+1;
        f[r]=1e9;
        while(l<r)
        {
            int mid=(l+r)>>1;
            if(f[mid]>=a[i]) r=mid;
            else l=mid+1;
        }
        f[l]=a[i];
        if(l==cnt+1) cnt++;
            if(f[i]>ans) 
        {    
        k=i;
        ans=f[i];        
        }
    }
    cout<<" max="<<cnt<<endl;
    dfs(k);
    return 0;
     
}

 

标签:cout,int,dfs,下降,ans,序列,include,最长,1001
From: https://www.cnblogs.com/xdzxlsy/p/16728648.html

相关文章

  • 最长上升子序列(LIS)
    题目:LIS(LongestIncreasingSubsequence)为最长上升子序列:给定n个元素的数列,求最长的上升子序列长度(LIS)。一个数的序列ai,当a1<a2<…<aS的时候,我们称这个序列是......
  • PHP序列化基础知识
    魔术方法:注:魔术方法只有在类中被定义以后才可以触发PHP将所有以__(两个下划线)开头的类方法保留为魔术方法,这些都是PHP内置的方法。__construct()当一个对象创建时被......
  • 序列
    实验 项目名称:      序列的应用               一.   实验目的和要求 初步认识序列二.  实验环境 win10三.  实验过......
  • CSP2021括号序列
    [CSP-S2021]括号序列题目描述小w在赛场上遇到了这样一个题:一个长度为\(n\)且符合规范的括号序列,其有些位置已经确定了,有些位置尚未确定,求这样的括号序列一共有多少......
  • 离线维护 支持插入数 的序列
    论离线维护插入单点碰到过好多类似的题,都在维护这个序列中卡住了,这是个简单易懂\(O(nlog^2_2n)\)我们考虑从后往前维护序列对于第n个插入的数,它最后所在的位置p就是预......
  • 我对java序列化的理解
    我对java序列化的理解​ 通过ObjectOutputStream输出流保存实体类所产生的文件,每一个流都一个序列化ID,如果我们不设置UID的话,一旦我们修改代码,这个文件就会出现InvalidC......
  • Python实验报告——第4章 序列的应用
    实验报告【实验目的】 1.掌握python中序列及序列的常用操作。2.根据实际需要选择使用合适的序列类型。【实验条件】1.PC机或者远程编程环境。 【实验内容】1.......
  • 前后端开发模式、API接口、接口测试工具postman、restful规范、序列化和反序列化、dja
    目录前后端开发模式一、两种模式1.传统开发模式:前后端混合开发1.1.缺点:2.前后端分离开发模式2.1.特点3.补充老刘的相关博客:二、API接口1.作用2.说明三、接口测试工具postm......
  • API接口、接口测试工具postman、restful规范、序列化与反序列化、djangorestframework
    API接口通过网络,规定了前台后台信息交流规则的url链接,也就是前后台信息交互的媒介API接口的样子url:长得像返回数据的url链接https://api.map.baidu.com/place/v2/s......
  • C#:多态之虚方法、抽象类、接口、 类的序列化、MD5加密。
     (总的来说多态的作用便是解决代码的冗余问题,但代码更加具有可读性,更加的简洁)多态的第一种表现形式:虚方法usingSystem;usingSystem.Collections.Generic;usingSystem......