- 浏览: 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);
}

如(1, 7), (3, 4,


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);
}
发表评论
-
最大子段和
2012-01-05 13:59 794给出N个数字, 计算出最大的子段和。 Input 第一行给 ... -
求两字符串匹配的最长子序列
2012-01-05 13:52 1033如果两种特征序列的公共子序列越长表示越接近,现在请你帮助计算出 ... -
编辑距离问题
2012-01-05 13:48 682#include<iostream> #incl ... -
Kruskal最小生成树
2011-12-08 14:26 720#include<iostream> #inclu ... -
prime
2011-12-01 20:09 628#include<iostream> using ... -
哈弗曼编码
2011-11-28 10:43 1#include<iostream> #defi ... -
哈弗曼编码
2011-11-28 10:42 558#include<iostream> #defi ... -
#贪心算法(零件加工)
2011-10-27 13:25 1014#include<stdio.h> #includ ... -
众数问题
2011-10-20 14:57 814#include <stdio.h> #inclu ... -
输油管道问题
2011-10-13 14:45 628#include <stdio.h> #inclu ... -
幂的精确求值
2011-09-22 15:07 477#include<iostream> using ... -
大数加法
2011-09-22 12:56 638#include<iostream> #incl ... -
三姐妹之出题
2011-09-15 14:15 703#include<iostream> #incl ... -
最大子段和问题(分治)(##)
2011-09-08 21:31 679#include<stdio.h> #defin ... -
最大子段和问题(O(N^2))
2011-09-08 15:04 626#include<stdio.h> int a[ ... -
最大子段和问题(O(N^3))
2011-09-08 14:45 500#include<stdio.h> int a[ ...
相关推荐
通过对以上代码的详细解析,我们可以看到求解最长不下降子序列问题的基本思路:首先通过动态规划的方法计算出以每个位置结尾的最长不下降子序列的长度,然后根据这些长度值找出最长的不下降子序列,并通过记录前驱...
// 初始化dp数组,每个元素的最长不减子序列长度至少为1(包含自身) for (int i = 1; i ; ++i) { for (int j = 0; j ; ++j) { // 如果当前元素大于或等于前面的元素,那么可以将其添加到最长不减子序列中 if...
最长不下降子序列(Longest Increasing Subsequence, LIS)是计算机科学中的一种经典问题,尤其在算法竞赛(ACM)中常被用作测试数据结构和动态规划技能的题目。该问题的目标是从一个给定的序列中找出一个尽可能长的...
这类问题在算法竞赛和实际应用中都很常见,例如在数据处理、文本分析、生物信息学等领域,寻找最长不下降子序列可以用来进行模式识别或序列比对。因此,掌握这类问题的解决方法对于编程学习者和专业人士都是非常有用...
给定一个无序的整数数组,找到其中最长上升子序列的长度。 上升子序列指的是一个子序列,它的每个元素都严格大于它前面的元素。最长上升子序列则是指所有上升子序列中最长的那一个。 以下是使用动态规划求解最长...
2. **动态规划求解**:通过两层循环遍历数组,并根据前序元素的值更新当前位置的最长下降子序列长度和数量。 3. **输出结果**:输出最长下降子序列的长度以及具有该长度的子序列的数量。 #### 总结 本题通过动态...
例如,序列[10, 22, 9, 33, 21, 50, 41, 60, 80]的最长不下降子序列可以是[10, 22, 33, 50, 60, 80]。 3. 动态规划求解方法 通过分析代码可知,求解最长不下降序列的基本步骤包括: - 初始化数组:通常会创建一个...
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的不下降序列。程序...
问题描述 设有整数序列b1,b2,b3,…,bm,若存在 i1 … ,且 bi1 …,则称b1,b2,b3,…,bm中有长度为n的不下降序列bi1,bi2,bi3,…,bin。求序列中最大不下降子序列长度k。
对于LIS问题,我们可以定义一个数组`dp`,其中`dp[i]`表示以序列中第`i`个元素结尾的最长不下降子序列的长度。初始时,`dp[0] = 1`,因为单个元素本身就是长度为1的不下降子序列。 动态规划的状态转移方程可以描述...
这个问题可以使用动态规划来解决,状态转移方程为dp[i] = max(dp[i-1], dp[j]+1),其中dp[i]表示以A[i]结尾的最长不下降子序列的长度。 四、最长公共子序列 最长公共子序列问题是一个经典的动态规划问题。问题的...
这个问题要求从一排学生中选择一定数量的人离开,使得剩下的学生能形成一个最长的上升子序列或下降子序列。解决方案同样是基于动态规划。 - **算法思路**: - 分别从左到右和从右到左计算最长上升子序列(数组 `...
我们可以用 DP[i] 表示最长不下降子序列的最大长度,状态转移方程为 DP[i] = MAX(1, DP[j] + 1),其中 j = 0, 1, ..., i-1。 优化版的代码使用了二分查找来优化搜索过程,时间复杂度为 O(n*logn)。 二、最长公共子...
- 改进版动态规划:使用动态规划结合二分查找的方法,维护一个单调递增的序列,该序列的每个元素代表了长度为 `i` 的最长不下降子序列的最小结尾值。通过二分查找确定更新的位置,可以将时间复杂度降低到 `O(nlogn)`...
- 最长不下降子序列:状态(i)表示考虑前i个元素时的最长不下降子序列。通过单调栈或单调队列,可以将时间复杂度优化到O(nlogn)。 - LCS (最长公共子序列):状态(i, j)表示两个字符串第i和第j位置对应的最长公共子...
函数通过遍历序列,寻找比`smallest`更小的整数,如果找到,就递归调用自身,增加子序列长度,并更新`best`为当前找到的最长递减子序列的长度。 递归函数的工作方式如下: 1. 遍历序列,从`start`位置开始。 2. ...
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一个经典的问题,主要涉及字符串处理和算法设计。在两个给定的字符串中,LCS是指没有经过重新排列的最长子串,这个子串同时存在于这两个字符串...
第一部分与最长下降子序列问题类似,我们可以设计状态`opt[i]`表示拦截到第`i`个导弹时,最多可以拦截到的导弹数量。状态转移方程同样为`opt[i]=max(opt[j])+1`,其中`h[i]>=h[j]`,`0=,`h[i]`表示第`i`个导弹的...
\[a_i > a_j > a_k > \cdots > a_m\] 且 \(i > j > k > \cdots > m\)(最长下降子序列)。 **解决思路:** 问题的关键在于找到最长非降子序列或最长下降子序列。我们可以通过动态规划的方法来解决这个问题。 **...
通过对序列的遍历,我们可以构建一个动态规划表,其中每个元素记录以该位置结尾的最长下降子序列的长度。通过这种方式,我们可以从序列的开始逐步构建出全局的最长下降子序列。 总的来说,动态规划是一种强大的算法...