51 Nod 1134 最长递增子序列 (动态规划基础)
原题链接:1134 最长递增子序列
题目分析:长度为 的数列
有多达
个子序列,但我们应用动态规划法仍可以很高效地求出最长递增子序列(
)。这里介绍两种方法。
先考虑用下列变量设计动态规划的算法。这里设输入数列的第一个数为 。
一位数组, |
|
一位数组, |
有了这些变量,动态规划法求 的算法便可以这样实现。
LIS()
L[0] = 0
A[0] = 0 // 选择小于 A[1] 到 A[n] 中任意一个数的值进行初始化
P[0] = -1
for i = 1 to n
k = 0
for j = 0 to i - 1
if A[j] < A[i] && L[j] > L[k]
k = j
L[i] = L[k] + 1 // 满足 A[j] < A[i] 且 L[j] 最大的 j 即为 k
P[i] = k // LIS 中 A[i] 的前一个元素为 A[k]
上述动态规划法的复杂度为 ,无法在限制时间内解开
的问题。因此我们需要考虑效率更高的解法。
实际上,只要把动态规划与二分搜索结合起来,就能进一步提高求解最长递增子序列的效率。这种算法要用到下列变量:
一维数组, |
|
整数,表示前 |
LIS()
L[0] = A[0]
length = 1
for i = 1 to n - 1
if L[length] < A[i]
L[length++] = A[i]
else
L[j] (j = 0, 1, ..., length - 1) 中第一个大于等于 A[i] 的元素 = A[i]
#include <iostream>
#include <algorithm>
#define MAX 100000
using namespace std;
long long n, A[MAX + 1], L[MAX];
int lcs() {
L[0] = A[0];
int length = 1;
for (int i = 1; i < n; i++) {
if (L[length - 1] < A[i]) {
L[length++] = A[i];
} else {
*lower_bound(L, L + length, A[i]) = A[i];
}
}
return length;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++)
cin >> A[i];
cout << lcs() << endl;
return 0;
}
51 Nod 1134 最长递增子序列 (动态规划基础)的更多相关文章
- 51 Nod 1134 最长递增子序列(经典问题回顾)
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元 ...
- 51Nod:1134 最长递增子序列
动态规划 修改隐藏话题 1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递 ...
- 51nod 1134 最长递增子序列
题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...
- 51nod 1134最长递增子序列
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素 ...
- 51Nod - 1134 最长递增子序列【动态规划】
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个数N ...
- LCS 51Nod 1134 最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个 ...
- 300. Longest Increasing Subsequence(LIS最长递增子序列 动态规划)
Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...
- 51node 1134 最长递增子序列 (数据结构)
题意: 最长递增子序列 思路: 普通的$O(n^2)$的会超时.. 然后在网上找到了另一种不是dp的写法,膜拜一下,自己写了一下解释 来自:https://blog.csdn.net/Adusts/a ...
- LIS 51Nod 1134 最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个 ...
随机推荐
- N1BOOK——[第五章 CTF之RE章]wp
推荐在了解了相应章节的内容后再来练习,你会觉得顿时悟了 记录一下自己的解题过程 2,3,4题目附件来源:https://book.nu1l.com/tasks/#/pages/reverse/5.4 ...
- 0RAYS元旦招新赛
一共有4道pwn题,题目不算难,但是挺考验调试能力的. pie 一个main函数就四次溢出... 第一次leak canary,第二次leak libc,第三次直接覆盖返回地址为one_gadgets ...
- props 使用场景 及 布局提升
一对一一边写html 一边写css一小块为单位html csscss html整块单位html csscss html react/first-react/src/views/Wk/index.jsx ...
- .NET 云原生架构师训练营(对象过程建模)--学习笔记
目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...
- Java 中的5个代码性能提升技巧,最高提升近10倍
文章持续更新,可以关注公众号程序猿阿朗或访问未读代码博客. 本文 Github.com/niumoo/JavaNotes 已经收录,欢迎Star. 这篇文章介绍几个 Java 开发中可以进行性能优化的 ...
- Error: Not found: 'package:json_annotation/json_annotation.dart'
问题原因 json_annotation版本不对 修改json_annotation版本号 当前可用版本号 json_annotation: ^2.2.0
- thymeleaf标签在js中调用转义变量与不转义变量写法
转义写法 [[${content.title}]] 不转义写法 有时候我们可能需要在页面上显示html代码 这样的话 就不能把字符串转义了 这时候可以采用下面这种写法 [(${content.txt} ...
- 【LeetCode】245. Shortest Word Distance III 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+暴力检索 日期 题目地址:https://lee ...
- 【LeetCode】238. Product of Array Except Self 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 两次遍历 日期 题目地址:https://leetcode.c ...
- 【剑指Offer】09. 用两个栈实现队列 解题报告(python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 一个栈用来保存输入,一个栈用来输出 日 ...