1759:最长上升子序列 3种实现(最长上升子序列)

1759:最长上升子序列

总时间限制: 
2000ms

内存限制: 
65536kB
描述
一个数的序列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
代码:
1、
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int a[1010],f[1010],n,maxn;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        f[i]=1;
    }

    for(int i=2;i<=n;i++)
      for(int j=1;j<=i-1;j++)
        if(a[i]>a[j]) f[i]=max(f[j]+1,f[i]);
    for(int i=1;i<=n;i++)
      maxn=maxn>f[i]?maxn:f[i];
    printf("%d",maxn);
    return 0;
}

2、

#include<cstdio>
using namespace std;
int f[9999];
int a[9999],ans,n;
int main()
{
    f[1]=1;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
      scanf("%d",&a[i]);
    for(int i=2;i<=n;i++)
    {
        for(int j=1;j<i;j++)
          if(a[j]<a[i]&&f[j]>f[i])
            f[i]=f[j];
        f[i]++;
    }
    ans=f[1];
    for(int i=1;i<=n;i++)
      ans=ans>f[i]?ans:f[i];
      printf("%d",ans);
    return 0;
}

3、

#include<iostream>
using namespace std;
#include<cstdio>
const int INF=10001;
#include<cstring>
const int N=1001;
long long  a[N],c[N],f[N];
int search(int l,int r,int i)/*二分查找*/
{
    if(l==r) return l;
    int mid=(l+r+1)/2;
    if(c[mid]>=a[i]) return search(l,mid-1,i);/*等号加到上面是上升序列*/
    if(c[mid]<a[i]) return search(mid,r,i);/*等号加到下面是不下降*/
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    scanf("%d",&a[i]);
    memset(c,127,sizeof(c));
    long long int  MAX=-INF;
    for(int i=1;i<=n;++i)
    {
        f[i]=search(0,i,i)+1;
        c[f[i]]=min(c[f[i]],a[i]);
        MAX=max(f[i],MAX);
    }
    printf("%d\n",MAX);
    return 0;
}
时间: 2025-01-14 10:04:17

1759:最长上升子序列 3种实现(最长上升子序列)的相关文章

codevs 1862 最长公共子序列(求最长公共子序列长度并统计最长公共子序列的个数)

题目描述 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y="y0,y1,-,yk-1"是X的子序列,存在X的一个严格递增下标序列<i0,i1,-,ik-1>,使得对所有的j=0,1,-,k-1,有xij = yj.例如,X="ABCBDAB",Y="BCDB"是X的一个子序

短连接、长连接和短轮询、长轮询

本文部分节选自长连接的几种实现方式.

LIS(最长的序列)和LCS(最长公共子)总结

LIS(最长递增子序列)和LCS(最长公共子序列)的总结 最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2) s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1; s1[i - 1] != s2[j - 1], dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]); 初始化:dp[i][0] = dp

lintcode 最长上升连续子序列 II(二维最长上升连续序列)

题目链接:http://www.lintcode.com/zh-cn/problem/longest-increasing-continuous-subsequence-ii/ 最长上升连续子序列 II 给定一个整数矩阵(其中,有 n 行, m 列),请找出矩阵中的最长上升连续子序列.(最长上升连续子序列可从任意行或任意列开始,向上/下/左/右任意方向移动). 样例 给定一个矩阵 [ [1 ,2 ,3 ,4 ,5], [16,17,24,23,6], [15,18,25,22,7], [14,1

拼多多:最长1串的种类数

题目:(根据回忆写的,只描述了大概意思) 现有一组0.1字符串,其字符数为m,可以将0更改为1的最大次数为n.在字符串中肯定存在在改动n次以内的最长的只由1组成的子串.最长子串可能会出现多次,现在求最长子串出现的次数. 其中,如果1的位置不发生变化就认为是一次.例如:对3,2, “010”来讲,先改第一个0后改第二个0的结果都是“111”,只算做最长子串出现一次. 例子: 样例:5,2,"10101" 样例结果:1 样例代码: 1 package test4ljd; 2 3 impor

7种习惯容易长皱纹:不经常喝水 洗脸水温度高

不经常喝水 皮肤含水量在10%-20%最合适,若体内水分不足,导致皮肤含水量低于10%,皮肤就会变得干燥.粗糙.松弛,时间长了,就容易长皱纹. 压力过大 经常闷闷不乐.急躁.紧张.愁眉苦脸,表情肌就容易产生纵向或横向的皱纹. 睡眠不足 经常睡不好会使内分泌紊乱,皮肤的调节功能受损,导致容颜憔悴. 曝晒 阳光会造成皮下胶原蛋白的损伤.断裂,使面部.颈部.手部的皮肤变干.变薄.失去弹性,皮肤逐渐变松起皱. 过度节食 如果身体营养状况好,皮肤营养供应充足,皮下组织丰满,皱纹就出现得晚,反之如果因过度节

LIS(最长递增子序列)和LCS(最长公共子序列)的总结

最长公共子序列(LCS):O(n^2) 两个for循环让两个字符串按位的匹配:i in range(1, len1) j in range(1, len2) s1[i - 1] == s2[j - 1], dp[i][j] = dp[i - 1][j -1] + 1; s1[i - 1] != s2[j - 1], dp[i][j] = max (dp[i - 1][j], dp[i][j - 1]); 初始化:dp[i][0] = dp[0][j] = 0; 伪代码: dp[maxn1][ma

按要求编写一个Java应用程序: (1)定义一个类,描述一个矩形,包含有长、宽两种属性,和计算面积方法。 (2)编写一个类,继承自矩形类,同时该类描述长方体,具有长、宽、高属性, 和计算体积的方法。 (3)编写一个测试类,对以上两个类进行测试,创建一个长方体,定义其长、 宽、高,输出其底面积和体积。

package jvxing; public class Jvxing { //成员变量 private double width; private double chang; public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getChang() { return chang; } public void setC

UVa 11404 回文子序列(LCS求最长回文串长度)

https://vjudge.net/problem/UVA-11404 题意: 给定一个由小写字母组成的字符串,删除其中的0个或多个字符,使得剩下的字母(顺序不变)组成一个尽量长的回文串.如果有多解,输出字典序最小的解. 思路: 首先,最长回文子串的长度可以通过正序字符串和逆序字符串进行LCS得出. 但是这道题目麻烦的是还要输出这个回文串,并且字典序得最小. 应用的主要还是LCS的思想方法,不过在进行状态转移的时候,再加上字符串的状态转移. 不过最后得到的字符串不一定是回文串,但是它的前一半肯