博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计蒜客 最长不下降子序列 (贪心+二分nlogn算法)
阅读量:4557 次
发布时间:2019-06-08

本文共 1381 字,大约阅读时间需要 4 分钟。

最长不下降子序列

题目链接:

题目:

求最长不下降子序列的长度

第一行为n,表示n个数 第二行n个数

最长不下降子序列的长度

N小于5000 for  each  num  < =maxint

样例输入

31 2 3

样例输出

3 思路:可以用O(n*n)做,就刚学贪心+二分nlogn的做法,所以这里就试了一下nlogn做法,即采用lower_bound,维护单调数组, 对于序列 a(1, 7, 3, 5, 9, 4, 8),dp的变化过程如下:
  • dp[0] = a[0] = 1,长度为1的LIS结尾元素的最小值自然没得挑,就是第一个数。 (dp = {1})
  • 对于a[1]=7,a[1]>dp[0],因此直接添加到dp尾,dp[1]=a[1]。(dp = {1, 7})
  • 对于a[2]=3,dp[0]< a[2]< dp[1],因此a[2]替换dp[1],令dp[1]=a[2],因为长度为2的LIS,结尾元素自然是3好过于7,因为越小这样有利于后续添加新元素。 (dp = {1, 3})
  • 对于a[3]=5,a[3]>dp[1],因此直接添加到dp尾,dp[2]=a[3]。 (dp = {1, 3, 5})
  • 对于a[4]=9,a[4]>dp[2],因此同样直接添加到dp尾,dp[3]=a[9]。 (dp = {1, 3, 5, 9})
  • 对于a[5]=4,dp[1]< a[5]< dp[2],因此a[5]替换值为5的dp[2],因此长度为3的LIS,结尾元素为4会比5好,越小越好嘛。(dp = {1, 3, 4, 9})
  • 对于a[6]=8,dp[2]< a[6]< dp[3],同理a[6]替换值为9的dp[3],道理你懂。 (dp = {1, 3, 4, 8})
这样子dp数组就维护完毕,所求LIS长度就是dp数组长度4。 AC代码如下:
//// Created by hanyu on 2019/8/9.//#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=1000+7;#define MAX 0x3f3f3f3fint main(){ int a[maxn],dp[maxn]; int n; while(~scanf("%d",&n)) { memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); for(int i=0;i
=dp[pos]) dp[++pos]=a[i]; else dp[lower_bound(dp,dp+pos+1,a[i])-dp]=a[i]; } printf("%d\n",pos+1); } return 0;}

 

 

转载于:https://www.cnblogs.com/Vampire6/p/11326548.html

你可能感兴趣的文章
U盘安装window系统
查看>>
远程登录Oracle数据库
查看>>
CSS精灵技术
查看>>
2019 Multi-University Training Contest 4
查看>>
Linux运维工程师成长路线及应实现的目标
查看>>
矩阵及矩阵范数求导
查看>>
放大镜
查看>>
学号 《信息安全系统设计基础》第7周学习总结(一)
查看>>
CLR线程概览(下)
查看>>
shell bash memo
查看>>
MySQL--Basic(二)
查看>>
Python----面向对象的软件开发
查看>>
查看Ubuntu版本
查看>>
maven deploy 指定-DaltDeploymentRepository
查看>>
Codeforces 549A. Face Detection[模拟]
查看>>
POJ1741Tree [点分治]【学习笔记】
查看>>
BZOJ 3238: [Ahoi2013]差异 [后缀自动机]
查看>>
UVA 12633 Super Rooks on Chessboard [fft 生成函数]
查看>>
memcache 启动 failed to start
查看>>
欧拉函数与欧拉定理
查看>>