最长上升(不下降)子序列(LIS) 不同求解方法(动规、贪心)
给定一个序列,求出它的最长上升子序列或者是最长不下降子序列的长度 或者输出这个子序列
一、动态规划 O(n^2)
1.求长度
首先来讨论最长上升子序列的情况,即子序列是严格上升的
假如我们以dp[i]表示以a[i]为结尾的上升子序列的长度 那么对于 j (1<=j<i),如果a[j]<a[i],很显然:
代码:
#include <bits/stdc++.h> using namespace std; int anss=,i,n,j,a[],dp[]; int main()
{
cin>>n;
for(i=;i<n;i++)
{
cin>>a[i];
}
for(i=;i<n;i++)
{
dp[i]=;
for(j=;j<i;j++)
{
if(a[j]<a[i]) //如果是最长不下降子序列就改为 if(a[j]<=a[i])
{
dp[i]=max(dp[j]+,dp[i]);
}
}
if(dp[i]>anss)
anss=dp[i];
}
cout<<anss<<endl;
}
2.求序列
只需要从dp数组向前遍历,找到dp[i]==anss的之后再找dp[i]==anss-1的....以此类推即可
#include <bits/stdc++.h> using namespace std; int anss=,i,n,j,a[],dp[]; int main()
{
cin>>n;
for(i=;i<n;i++)
{
cin>>a[i];
}
for(i=;i<n;i++)
{
dp[i]=;
for(j=;j<i;j++)
{
if(a[j]<a[i])
{
dp[i]=max(dp[j]+,dp[i]);
}
}
if(dp[i]>anss)
anss=dp[i];
}
cout<<anss<<endl;
}
不过通常最长上升子序列的解是不唯一的,长度是唯一的。
二、贪心 O(nlogn)
对于一个上升子序列,显然其结尾元素越小,越有利于在后面接其他的元素,也就越可能变得更长。
因此,我们只需要维护 dp 数组(虽然已经不是动态规划了),对于每一个a [ i ],如果a [ i ]能接到 LIS 后面,就接上去;否则,就用 a [ i ] 取更新 dp数组:在dp数组中找到第一个大于等于a [ i ]的元素dp[ j ],用a [ i ]去更新dp [ j ]。怎么找到第一个大于等于的元素呢?只需要使用lower_bound()函数即可。
至于最长不下降子序列,只需要将 “在dp数组中找到第一个大于等于a [ i ]的元素dp[ j ]” 这一步改为找到第一个大于的元素即可。同样的将lower_bound换成upper_bound()
1.代码
#include <bits/stdc++.h> using namespace std; int anss=,i,n,j,a[],dp[],temp; int main()
{
cin>>n;
for(i=;i<n;i++)
{
cin>>a[i];
dp[i]=0x7ffffff;
}
for(i=;i<n;i++)
{
temp=lower_bound(dp,dp+n,a[i])-dp;
if(temp+>anss)
{
anss++;
}
dp[temp]=a[i];
}
cout<<anss<<endl;
}
2.求序列
只需要另外开一个数组b,记录dp[i]的位置,然后从b数组向前遍历,找到b[i]==anss的之后再找b[i]==anss-1的....以此类推
#include <bits/stdc++.h> using namespace std; int anss=,i,n,j,a[],dp[],temp,b[],c[]; int main()
{
cin>>n;
for(i=;i<n;i++)
{
cin>>a[i];
dp[i]=0x7ffffff;
}
for(i=;i<n;i++)
{
temp=lower_bound(dp,dp+n,a[i])-dp;
if(temp+>anss)
{
anss++;
}
dp[temp]=a[i];
b[i]=temp;
}
cout<<anss<<endl;
temp=anss-;
for(i=n-;i>=;i--)
{
if(b[i]==temp)
{
c[temp]=a[i];
temp--;
}
}
for(i=;i<anss;i++)
{
cout<<c[i]<<' ';
}
}
最长上升(不下降)子序列(LIS) 不同求解方法(动规、贪心)的更多相关文章
- 最长非降/下降子序列问题(DP)(待续...)
注意:抽象成以下描述即为最长非降/下降子序列问题(一维状态) 问题描述:在一个无序的序列a1,a2,a3,a4…an里,找到一个最长的序列满足:(不要求连续) ai<=aj<=ak…< ...
- Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)
Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列) Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺 ...
- SPOJ 3943 - Nested Dolls 最长不下降子序列LIS(二分写法)
现在n(<=20000)个俄罗斯套娃,每个都有宽度wi和高度hi(均小于10000),要求w1<w2并且h1<h2的时候才可以合并,问最少能剩几个. [LIS]乍一看跟[这题]类似, ...
- HDU 1087 最长不下降子序列 LIS DP
Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. May ...
- hdu 4604 Deque(最长上升与下降子序列-能够重复)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4604 这个题解有点问题,暂时没时间改,还是参考别人的吧 #include <cstdio> ...
- 求最长非降(递增)子序列LIS的长度,及注意事项
非降序列(Increasing Sequence)例如: (1) 完全递增型序列:S={1,3,6,7,9} (2) 部分存在等于的序列:S={1,3,3,6,9} S的非降子序列:由原序列S的元素组 ...
- Longest Ordered Subsequence POJ - 2533 dp 最长上升/不下降 子序列
#include<iostream> using namespace std ; ; int f[N]; int a[N]; int n; int main() { cin>> ...
- 动态规划——最长不下降子序列(LIS)
最长不降子序列是这样一个问题: 下面介绍动态规划的做法. 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度.这样对 A[i] 来说就会有两种可能: 如果存在 A[i] 之前的元素 A[j] ...
- HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...
随机推荐
- 【leetcode】1252. Cells with Odd Values in a Matrix
题目如下: Given n and m which are the dimensions of a matrix initialized by zeros and given an array ind ...
- 什么是BFC(块级格式上下文)?
㈠什么是BFC? BFC 全称为 块格式化上下文 (Block Formatting Context) . 定义:浮动元素和绝对定位元素,非块级盒子的块级容器(例如 inline-blocks, ta ...
- 2018 计蒜之道-初赛 第一场 A-百度无人车
百度一共制造了 nn 辆无人车,其中第 ii 辆车的重量为 a_i\ \mathrm{kg}ai kg. 由于车辆过重会增大轮胎的磨损程度,现在要给这 nn 辆车减轻重量.每将一辆车减轻 1\ \m ...
- HGOI 20190709 题解
Problem A 紫色激情 一个序列$\{a_n\}$,求出方差最大的子序列. 其中方差 [l,r] 的定义是$S^2 = \frac{1}{n} \sum\limits_{i=l}^{r} (x_ ...
- JS框架_(JQuery.js)绚丽的3D星空动画
百度云盘: 传送门 密码:8ft8 绚丽的3D星空动画效果(纯CSS) (3D星空动画可以用作网页背景,Gary为文本文字) <!doctype html> <html lang=& ...
- 使用 vuetron 调试 mpvue 项目
简介 由于小程序开发工具的封闭,我们无法通过安装 chrome 插件来方便地使用 vue-devtools 调试我们的 mpvue 项目.vuetron 是一个 vue.js 的项目调试工具, 同时支 ...
- 【学习】SpringBoot之简介、特点、缺点、应用场景
Spring Boot 的介绍 SpringBoot的目的在于创建和启动新的基于Spring框架的项目.Spring Boot 会选择最合适的Spring子项目和第三方开源库进行整合.大部分Sprin ...
- TreeMap元素必须实现Comparable接口
纠正一下,TreeMap实现一定顺序是通过Comparable接口的,而他实现元素不重复也是完全通过compareTo,而不是hashCode和equals,因为debug不会走到hashCode和e ...
- 2018-2019-2 网络对抗技术 20165232 Exp7 网络欺诈防范
2018-2019-2 网络对抗技术 20165232 Exp7 网络欺诈防范 原理与实践说明 1.实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应 ...
- 后盾网lavarel视频项目---lavarel用户认证实例
后盾网lavarel视频项目---lavarel用户认证实例 一.总结 一句话总结: 主要是用的Auth认证,所以配置是配置的auth(config/auth.php),控制器中调用也是用的Auth( ...