题目:
设有一个正整数的序列: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 100001
void vInput(int nDa[],int nN);
int nGetSum(int nDa[],int nN);
int nFind(int nArr[],int nV,int nCHight,int nCLow);
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;
int nPos;
int nCount;
int nUpLimit[MAX];
for(i=1;i<=nN;i++)
{
nUpLimit[i] = nDa[nN];
}
nCount = 1;
for(i=nN-1;i>=1;i--)
{
if(nDa[i] <= nUpLimit[nCount])
{
nCount ++;
nUpLimit[nCount] = nDa[i];
}
else
{
if(nDa[i] > nUpLimit[1])
{
nUpLimit[1] = nDa[i];
}
else
{
nPos = nFind(nUpLimit,nDa[i],nCount,1);
nUpLimit[nPos] = nDa[i];
}
}
}
return nCount;
}
//二分查找
int nFind(int nArr[],int nV,int nCHight,int nCLow)
{
int nCMid;
int nAns;
if(nCHight == nCLow)
{
nAns = nCHight;
return nAns;
}
nCMid = (nCHight+nCLow)/2;
if(nV > nArr[nCMid])
{
nAns = nFind(nArr,nV,nCMid,nCLow);
}
else
{
nAns = nFind(nArr,nV,nCHight,nCMid+1);
}
return nAns;
}
void vOutput(int nRet)
{
printf("%d\n",nRet);
}
分享到:
相关推荐
- 改进版动态规划:使用动态规划结合二分查找的方法,维护一个单调递增的序列,该序列的每个元素代表了长度为 `i` 的最长不下降子序列的最小结尾值。通过二分查找确定更新的位置,可以将时间复杂度降低到 `O(nlogn)`...
动态规划的典型问题包括但不限于最长不下降子序列、背包问题、编辑距离等。最长不下降子序列问题要求从一个无序的整数数组序列中寻找一个最长的子序列,使得这个子序列中的数是按非降序排列的。动态规划算法可以有效...
例如,最长不下降子序列问题中,状态(i)表示以第 i 个元素结尾的最长不下降序列的长度。通过使用单调辅助数组和二分查找,可以将时间复杂度优化至O(nlogn)。类似的应用还包括拦截导弹、Beautiful People和Segment...
- 最长不下降子序列:状态(i)表示考虑前i个元素时的最长不下降子序列。通过单调栈或单调队列,可以将时间复杂度优化到O(nlogn)。 - LCS (最长公共子序列):状态(i, j)表示两个字符串第i和第j位置对应的最长公共子...
如:背包问题、最长公共子序列等。 - **贪心算法**:每一步选择局部最优解,期望全局最优。如:霍夫曼编码、Prim算法构造最小生成树。 - **二分法**:用于有序序列,快速查找目标值。例如:二分查找算法。 - **...
5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67 5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列生成 71 6.3 逆序 72 6.3.1...
#### 5.3 最长上升子序列 / 最长不下降子序列 (LIS) - **O(n^2)**:最长上升子序列的一种实现方法。 - **O(nlogn)**:使用二分查找优化最长上升子序列的实现。 #### 5.4 Joseph 问题 - Joseph 问题是一个经典的...
**5.3 最长上升子序列/最长不下降子序列(LIS)** - O(n^2)和O(nlogn)的两种算法实现。 **5.4 Joseph问题** - 描述了一个循环淘汰游戏的数学模型。 **5.5 0/1背包问题** - 优化问题,旨在最大化收益的同时不超过...
- **最长公共子序列**:用于找出两个序列的最长公共子序列,常应用于文本编辑距离计算。 6. **字符串处理**: - **KMP算法**:用于字符串匹配,避免了不必要的回溯,提高了匹配效率。 - **Manacher's Algorithm*...
如背包问题、最长公共子序列(LCS)和斐波那契数列等。源码中可能会展示如何构建状态转移方程,以及如何利用记忆化技术来避免重复计算,提高效率。 图算法也是不容忽视的一部分,例如Dijkstra短路径算法、Floyd-...
3. **堆排序的时间性能**:在最坏情况下,堆排序的时间性能是O(nlogn),这使得它在某些情况下优于快速排序,尤其是在输入规模较大时。 4. **快速排序的平均性能**:虽然快速排序具有很好的平均时间性能,但在最坏...