`
niyayu
  • 浏览: 34170 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

最长不下降子序列长度

 
阅读更多
对于序列(1, 7, 3, 5, 9, 4,,有它的一些不下降子序列
如(1, 7), (3, 4,等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5,
Input

多组cas , 每组cas 两行:

第一行 输入一个数 n (n < 10000), 表示有n个数

第二行 n个数, 分别代表每个数;

Output

每个cas 一行  输出 该书数列的最长的长度 ;


Sample Input

7

1 7 3 5 9 4 8

Sample Output

4





#include<iostream>

using namespace std;

#define MAX 10001

void vInput(int nN,int nA[]);
int nGetLong(int nN,int nA[]);
int nFind(int nUL[],int nA,int nHigh,int Low);
void vOut(int nOut);

int main()
{
    int nNum;
    int nArr[MAX];
    int nAns;

    while(1==scanf("%d",&nNum))
    {
        vInput(nNum,nArr);
        nAns=nGetLong(nNum,nArr);
        vOut(nAns);
    }
    return 0;
}


void vInput(int nN,int nA[])
{
    int i;

    for(i=1;i<=nN;i++)
    {
        scanf("%d",&nA[i]);
    }
}

int nGetLong(int nN,int nA[])
{
    int i;
    int nCount;
    int nUpLimit[MAX];
    int nPos;

    for(i=1;i<=nN;i++)
    {
        nUpLimit[i]=nA[nN];
    }

    nCount=1;
    for(i=nN-1;i>=1;i--)
    {
        if(nA[i]<=nUpLimit[nCount])
        {
            nCount++;
            nUpLimit[nCount]=nA[i];
        }
        else
        {
            nPos=nFind(nUpLimit,nA[i],nCount,1);
            nUpLimit[nPos]=nA[i];
        }
    }
    return nCount;
}

int nFind(int nUL[],int nA,int nHigh,int nLow)
{
    int nMid;
    int nRet;

    nMid=(nHigh+nLow)/2;
    if(nHigh==nLow)
    {
        nRet=nHigh;
        return nRet;
    }
    if(nA>nUL[nMid])
    {
        nRet=nFind(nUL,nA,nMid,nLow);
    }
    else
        nRet=nFind(nUL,nA,nHigh,nMid+1);
    
    return nRet;
}

void vOut(int nOut)
{
    printf("%d\n",nOut);
}
分享到:
评论

相关推荐

    求最长不下降序列, 完全是代码

    通过对以上代码的详细解析,我们可以看到求解最长不下降子序列问题的基本思路:首先通过动态规划的方法计算出以每个位置结尾的最长不下降子序列的长度,然后根据这些长度值找出最长的不下降子序列,并通过记录前驱...

    最长不减子序列

    // 初始化dp数组,每个元素的最长不减子序列长度至少为1(包含自身) for (int i = 1; i ; ++i) { for (int j = 0; j ; ++j) { // 如果当前元素大于或等于前面的元素,那么可以将其添加到最长不减子序列中 if...

    最长不下降子序列

    最长不下降子序列(Longest Increasing Subsequence, LIS)是计算机科学中的一种经典问题,尤其在算法竞赛(ACM)中常被用作测试数据结构和动态规划技能的题目。该问题的目标是从一个给定的序列中找出一个尽可能长的...

    60、【例9.3】求最长不下降序列(2020.01.24)-A.pdf

    这类问题在算法竞赛和实际应用中都很常见,例如在数据处理、文本分析、生物信息学等领域,寻找最长不下降子序列可以用来进行模式识别或序列比对。因此,掌握这类问题的解决方法对于编程学习者和专业人士都是非常有用...

    什么是最长上升子序列,和最长不下降子序列有什么区别

    给定一个无序的整数数组,找到其中最长上升子序列的长度。 上升子序列指的是一个子序列,它的每个元素都严格大于它前面的元素。最长上升子序列则是指所有上升子序列中最长的那一个。 以下是使用动态规划求解最长...

    PKU 1925最长下降子序列

    2. **动态规划求解**:通过两层循环遍历数组,并根据前序元素的值更新当前位置的最长下降子序列长度和数量。 3. **输出结果**:输出最长下降子序列的长度以及具有该长度的子序列的数量。 #### 总结 本题通过动态...

    61、【例9.3】求最长不下降序列(2020.01.24)-A.pdf

    例如,序列[10, 22, 9, 33, 21, 50, 41, 60, 80]的最长不下降子序列可以是[10, 22, 33, 50, 60, 80]。 3. 动态规划求解方法 通过分析代码可知,求解最长不下降序列的基本步骤包括: - 初始化数组:通常会创建一个...

    1281:最长上升子序列.7z

    1259:【例9.3】求最长不下降序列 【题目描述】 设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1…且有b(i1)(i2)&lt;…(ie)则称为长度为e的不下降序列。程序...

    最长不下降子序列.cpp

    问题描述 设有整数序列b1,b2,b3,…,bm,若存在 i1 … ,且 bi1 …,则称b1,b2,b3,…,bm中有长度为n的不下降序列bi1,bi2,bi3,…,bin。求序列中最大不下降子序列长度k。

    算法-求最长不下降序列(信息学奥赛一本通-T1259).rar

    对于LIS问题,我们可以定义一个数组`dp`,其中`dp[i]`表示以序列中第`i`个元素结尾的最长不下降子序列的长度。初始时,`dp[0] = 1`,因为单个元素本身就是长度为1的不下降子序列。 动态规划的状态转移方程可以描述...

    动态规划专题.pdf

    这个问题可以使用动态规划来解决,状态转移方程为dp[i] = max(dp[i-1], dp[j]+1),其中dp[i]表示以A[i]结尾的最长不下降子序列的长度。 四、最长公共子序列 最长公共子序列问题是一个经典的动态规划问题。问题的...

    java实现动态规划问题.docx

    这个问题要求从一排学生中选择一定数量的人离开,使得剩下的学生能形成一个最长的上升子序列或下降子序列。解决方案同样是基于动态规划。 - **算法思路**: - 分别从左到右和从右到左计算最长上升子序列(数组 `...

    动态规划经典题目

    我们可以用 DP[i] 表示最长不下降子序列的最大长度,状态转移方程为 DP[i] = MAX(1, DP[j] + 1),其中 j = 0, 1, ..., i-1。 优化版的代码使用了二分查找来优化搜索过程,时间复杂度为 O(n*logn)。 二、最长公共子...

    动态规划专题

    - 改进版动态规划:使用动态规划结合二分查找的方法,维护一个单调递增的序列,该序列的每个元素代表了长度为 `i` 的最长不下降子序列的最小结尾值。通过二分查找确定更新的位置,可以将时间复杂度降低到 `O(nlogn)`...

    DP问题不完全总结.pdf

    - 最长不下降子序列:状态(i)表示考虑前i个元素时的最长不下降子序列。通过单调栈或单调队列,可以将时间复杂度优化到O(nlogn)。 - LCS (最长公共子序列):状态(i, j)表示两个字符串第i和第j位置对应的最长公共子...

    动态规划1

    函数通过遍历序列,寻找比`smallest`更小的整数,如果找到,就递归调用自身,增加子序列长度,并更新`best`为当前找到的最长递减子序列的长度。 递归函数的工作方式如下: 1. 遍历序列,从`start`位置开始。 2. ...

    Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法

    最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一个经典的问题,主要涉及字符串处理和算法设计。在两个给定的字符串中,LCS是指没有经过重新排列的最长子串,这个子串同时存在于这两个字符串...

    动态规划详细教程[参照].pdf

    第一部分与最长下降子序列问题类似,我们可以设计状态`opt[i]`表示拦截到第`i`个导弹时,最多可以拦截到的导弹数量。状态转移方程同样为`opt[i]=max(opt[j])+1`,其中`h[i]&gt;=h[j]`,`0=,`h[i]`表示第`i`个导弹的...

    历年NOIP所有动态规划题附带解析

    \[a_i &gt; a_j &gt; a_k &gt; \cdots &gt; a_m\] 且 \(i &gt; j &gt; k &gt; \cdots &gt; m\)(最长下降子序列)。 **解决思路:** 问题的关键在于找到最长非降子序列或最长下降子序列。我们可以通过动态规划的方法来解决这个问题。 **...

    动态规划的很经典的教程.docx

    通过对序列的遍历,我们可以构建一个动态规划表,其中每个元素记录以该位置结尾的最长下降子序列的长度。通过这种方式,我们可以从序列的开始逐步构建出全局的最长下降子序列。 总的来说,动态规划是一种强大的算法...

Global site tag (gtag.js) - Google Analytics