题目:
设有一个正整数的序列:d1,d2,…,dn,对于下标i1<i2<…<im,若有di1≤di2≤…≤dim
则称存在一个长度为m的上升序列。
例如,下列数列
13 7 9 16 38 24 37 18 44 19 21 22 63 15
对于下标i1=1,i2=4,i3=5,i4=9,i5=13,满足13<16<38<44<63,则存在长度为5的上升序列。
#include<stdio.h>
#define MAX 10000
void vInput(int nDa[],int nN);
int nGetSum(int nDa[],int nN);
void vOutput(int nRet);
int main()
{
int nNum;
int nAns;
int nData[MAX];
while(1 == scanf("%d",&nNum))
{
vInput(nData,nNum);
nAns = nGetSum(nData,nNum);
vOutput(nAns);
}
return 0;
}
void vInput(int nDa[],int nN)
{
int i;
for(i=1;i<=nN;i++)
{
scanf("%d",&nDa[i]);
}
}
int nGetSum(int nDa[],int nN)
{
int i,j;
int nTemp;
int nCount[MAX];
int nOut = 1;
//初始化一维数组,存放最后一位值到当前值最长上升子序列的个数
for(i=1;i<=nN;i++)
{
nCount[i] = 0;
}
//以自底向上的方法,从后往前
for(i=nN;i>=1;i--)
{
nTemp = 0;
//当前值往后遍历,找到上升子序列的个数最大的
for(j=i+1;j<=nN;j++)
{
if(nDa[i] < nDa[j])
{
if(nTemp < nCount[j])
nTemp = nCount[j];
}
}
nCount[i] = nTemp+1;
if(nOut <= nTemp)
nOut = nTemp+1;
}
return nOut;
}
void vOutput(int nRet)
{
printf("%d\n",nRet);
}
/*
7
1 5 9 6 5 8 9
*/
分享到:
相关推荐
在算法领域,最长上升子序列(Longest Increasing Subsequence,LIS)问题是一个经典的问题,它在计算机科学中有着广泛的应用,例如在数据结构、排序算法以及动态规划等方面。本篇将详细介绍如何找出一个序列中长度...
本题解聚焦于LeetCode的第300题——最长上升子序列(Longest Increasing Subsequence, LIS),这是一个典型的动态规划问题。 动态规划是算法设计的一种策略,通过将复杂问题分解成更小的子问题来解决。在最长上升子...
动态规划概念 最长上升子序列 最长公共子序列 矩阵连乘问题 背包问题 树形DP 状态压缩DP
本题通过动态规划的方法有效地解决了寻找最长上升子序列的问题。虽然时间复杂度为 \(O(n^2)\),但对于题目所给的数据范围(\(1 \leq N \leq 1000\))来说是足够高效的。此外,代码中还包含了输入输出的处理细节,...
你的任务,就是对于给定的序列,求出最长上升子序列的长度。 输入样例 7 1 7 3 5 9 4 8 6 1 8 3 6 5 9 5 1 2 3 4 5 0 输出样例 4 4 5 提示 一,对输入字符串的处理 注意:这道题和其他题的输入输出不同,这题...
动态规划的经典题目最长上升子序列,而且是经过二分优化的NlogN复杂度算法
最长上升子序列(Longest Increasing Subsequence,简称 LIS)是一个经典的动态规划问题。给定一个无序的整数数组,找到其中最长上升子序列的长度。 上升子序列指的是一个子序列,它的每个元素都严格大于它前面的...
输入序列,求最长上升子序列的长度,算法复杂度nlgn
- 第二段代码中同样使用动态规划,其中用f数组来保存每个位置的最长上升子序列长度,并在每次更新时寻找当前的最大值。 2. 动态规划(Dynamic Programming,简称DP): - 动态规划是一种算法思想,用于求解具有...
下面,我们将讨论动态规划经典问题算法,包括合唱队行、最大 k 乘积、0-1 背包问题、最长上升子序列、田忌赛马、花瓶插花等。 一、合唱队行 合唱队行是动态规划经典问题之一。该问题可以描述为:有 n 个人站在一排...
3. **最长上升子序列 (LIS)**:对于一个序列S,其最长上升子序列是指S中的一个子序列,该子序列是严格递增的,且长度最长。 #### 三、问题定义 假设我们有两个字符串(或整数序列)a和b,我们的目标是找到这两个...
1259:【例9.3】求最长不下降序列 【题目描述】 设有由n(1≤n≤200)个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)≠b(j)(i≠j),若存在i1…且有b(i1)(i2)<…(ie)则称为长度为e的不下降序列。程序...
### 最长上升子序列(LIS)知识点详解 #### 一、定义与应用场景 最长上升子序列(Longest Increasing Subsequence, 简称LIS)问题是...以上就是关于最长上升子序列问题及其动态规划解法的详细介绍。希望对你有所帮助!
在解决最长上升子序列问题时,通常采用动态规划(Dynamic Programming, DP)的方法。动态规划是一种通过将原问题分解成更小的子问题,并存储子问题的解来避免重复计算,从而优化求解过程的技术。 具体到LIS问题,...
【最长上升子序列】是计算机科学中的一个经典...总结来说,最长上升子序列问题是一个典型的动态规划问题,适用于解决序列中寻找特定子序列的问题。掌握这种问题的解决方法对于提升算法能力和解决实际问题具有重要意义。
标题中提到的知识点是"C语言:基于c代码实现的最长上升子序列",描述部分则简单地提到了"最长上升子序列"。在给出的内容中,是一段C语言的代码,这段代码实现的是求解一个序列中最长上升子序列的长度。 首先,我们...
最长上升子序列的算法通常使用动态规划来解决,其基本思想是:对于每个元素,找到之前所有元素中最大的一个,使得这个元素可以作为它的延续,从而构成一个更长的上升子序列。这个过程中,我们需要维护一个数组,存储...
300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度。 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。 说明: 可能会有多种最长上升子...
最长公共子序列(Longest Common Subsequence,LCS)问题是一个...总的来说,这个C++代码展示了如何利用动态规划求解最长公共子序列问题,通过逐个比较字符并存储子问题的解,有效地找到X和Y的最长公共子序列的长度。