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个 ...
随机推荐
- Java 在Word中嵌入多媒体(视频、音频)文件
Word中可将Office(Word/Excel/PowerPoint).PDF.txt等文件作为OLE对象插入到文档中,双击该对象可直接访问或编辑该文件,除了以上常见的文件格式对象,也可以插入多媒体 ...
- SpringBoot Redis 发布订阅模式 Pub/Sub
SpringBoot Redis 发布订阅模式 Pub/Sub 注意:redis的发布订阅模式不可以将消息进行持久化,订阅者发生网络断开.宕机等可能导致错过消息. Redis命令行下使用发布订阅 pu ...
- CF803B Distances to Zero 题解
Content 有一个长度为 \(n\) 的序列 \(a_1,a_2,a_3,...,a_n\),求每个数与它最近的 \(0\) 的距离(\(0\) 的距离为 \(0\)). 数据范围:\(1\leq ...
- CF1292B Aroma's Search 题解
Content 给定一个坐标系,已知第一个点的坐标为 \((x_0,y_0)\),第 \(i(i>0)\) 个点的坐标满足这样的两个递推式:\(x_i=a_xx_{i-1}+b_x,y_i=a_ ...
- SpringCloud Alibaba实战(12:引入Dubbo实现RPC调用)
源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 大家好,我是老三,断更了半年,我又滚回来继续写这个系列了,还有人看吗-- 在前面的章 ...
- JavaScript扫盲笔记:
JavaScript学习: JavaScript代码存在形式: -Head中 <script> </script> -文件 <script src='代码所在路径'> ...
- bootstrap栅格例子
<div class="container-fluid "> <div class="row"> <div class=" ...
- Postman环境变量的使用
前言 请注意,Postman新版有ui上的改动,本文使用的Postman 版本8.4.0 for Mac, ui有调整,但是功能无改变. Postman是一款接口调测的软件,服务端开发的同学肯定会对自 ...
- npm ERR! Error: EPERM: operation not permitted
转载于:https://blog.csdn.net/qq_36772866/article/details/86934950 win10 在npm install时报错 解决方案 删除node-mou ...
- 【LeetCode】697. Degree of an Array 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 求出最短相同子数组度的长度 使用堆求最大次数和最小长 ...