1019 ModricWang的序列问题

思路

此题题意非常清晰,给定一个序列,求出最长上升子序列的长度。从数据规模来看,需要\(O(nlogn)\) 的算法。

\(O(nlongn)\) 求最长上升子序列的做法如下:

维护一个数组\(f[]\) ,其中\(f[i]\) 表示当前步骤下长度为i的上升子序列的末尾元素的最小值。

需要注意的是,\(f[i]\) 一定是单调递增的,这个结论十分显然,这里就不做证明了。

使用动态规划思想,对于原序列中的每个元素,都拿去更新一次\(f[]\) 。假设当前元素为\(num[i]\) , \(f[]\) 长度为len(从1开始计数) 更新方法如下:

  • 如果\(num[i]>f[len]\) , 将\(num[i]\) 放到\(f[len]\) 后面

  • 否则,找到\(f[len]\) 中第一个比\(num[i]\) 大的位置,并替换它

最后\(f[]\) 的长度就是最长上升子序列的长度。

代码

#include <iostream>
#include <random>using namespace std;const int MAXN = 500010;
int nums[MAXN], pool[MAXN];//用二分查找的方法找到一个位置,使得num>pool[i-1] 并且num<pool[i],并用num代替b[i]
int Search(int num, int low, int high) {int mid;while (low <= high) {mid = (low + high)/2;if (num > pool[mid]) low = mid + 1;else high = mid - 1;}return low;
}int DP(int n) {int i, len, pos;pool[1] = nums[1];len = 1;for (i = 2; i <= n; i++) {if (nums[i] > pool[len]) {   //如果a[i]比b[]数组中最大还大直接插入到后面即可len = len + 1;pool[len] = nums[i];} else {    //用二分的方法在b[]数组中找出第一个比a[i]大的位置并且让a[i]替代这个位置pos = Search(nums[i], 1, len);pool[pos] = nums[i];}}return len;
}int main() {
#ifdef ONLINE_JUDGEios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#endifint n;cin >> n;for (int i = 1; i <= n; i++)cin >> nums[i];cout << DP(n) << "\n";
}

转载于:https://www.cnblogs.com/AlvinZH/p/7977941.html

2016级算法第四次上机-B ModricWang的序列问题相关推荐

  1. 2016级算法第四次上机-C.AlvinZH的1021实验

    975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...

  2. 2016级算法第六次上机-A.Bamboo之寻找小金刚

    Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 ...

  3. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  4. 2016级算法第五次上机-C.Bamboo和Coco

    1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...

  5. 2016级算法第三次上机-G.Winter is coming

    904 Winter is coming 思路 难题.首先简化问题, \(n\) 个0与 \(m\) 个1排成一列,连续的0不能超过x个,连续的1不能超过y个,求排列方法数. 显然会想到这是动态规划. ...

  6. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

  7. 2016级算法期末上机-H.难题·AlvinZH's Fight with DDLs III

    1119 AlvinZH's Fight with DDLs III 思路 难题,最小点覆盖. 分析题意,某一个任务,既可以在笔记本A的 \(a\) 模式下完成,也可以在笔记本B的 \(b\) 模式下 ...

  8. 2016级算法期末上机-F.中等·AlvinZH's Fight with DDLs II

    1118 AlvinZH's Fight with DDLs II 思路 中等题,贪心. 理解题意,每次攻击中,可以使某个敌人生命值-1,自己生命值减去∑存活敌人总攻击力. 贪心思想,血量少攻击高的要 ...

  9. 2016级算法第二次上机-F.ModricWang's Number Theory II

    891 ModricWang's Number Theory II 思路 使得序列的最大公约数不为1,就是大于等于2,就是找到一个大于等于2的数,它能够整除序列中的所有数. 考虑使得一个数d整除数组中 ...

最新文章

  1. jQuery HTML 添加和删除元素
  2. Java程序员从笨鸟到菜鸟之(一百零九)一步一步学习webservice(三)开发第一个基于XFire的webservice
  3. POJ 1986 Distance Queries(LCA)
  4. Java集合(三):Queue队列
  5. 您从事运维有几年了?
  6. C4D本来很简单(新手入门学习方法+C4D工作流程)
  7. PHP的时间增加10分钟和加一天的时间
  8. 李开复:几年内电子商务上市潮会来临
  9. matlab2018a课后答案,[2018年最新整理]matlab习题及答案.doc
  10. docker运行portainer
  11. NOR 与 NAND的区别对比分析
  12. 非全日制研究生计算机学校,计算机非全日制硕士有哪些学校?
  13. oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
  14. 实时即未来,车联网项目之电子围栏分析【六】
  15. 你真的知道如何在B站赚钱吗?
  16. 企业信息化、数字化和智能化的区别
  17. 【河北OI 2012 DAY1】采花 线段树
  18. 2023年上半年软考程序员考试总结体会
  19. 操作系统原理_田丽华(7)死锁
  20. uniCloud云函数操作云数据库增删改查

热门文章

  1. 实现购物车的Session
  2. 全局搜索关键字命令_linux全局搜索命令有哪些?
  3. python3.6安装cv2库_win10 +python3.6环境下安装opencv以及pycharm导入cv2有问题的解决办法...
  4. C语言字母的压缩,C语言字符串快速压缩算法代码
  5. mysql分组查询 having,MYSQL-分组查询-where和having的区别
  6. Concurrenthashmap的putIfAbsent方法
  7. window7 修改docker安装的machine 位置
  8. NSRegularExpression iOS自带的正则表达式
  9. 38 NoSQL-memcached
  10. CentOS7--IP配置与网络问题排查