动态规划——最长上升子序列问题(LIS)

最长上升子序列问题(LIS)。给定n个整数A1,A2,…,AnA_1, A_2, \dots , A_n,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变)。例如序列1, 6, 2, 3, 7, 5,可以选出上升子序列1, 2, 3, 5,也可以选出1, 6, 7,但前者更长。选出的上升子序列中相邻元素不能相等。

算法设计

该算法是动态规划——基本思想中的编号动态规划问题,输入为x1,x2,…,xnx_1, x_2, \dots, x_n,子问题为x1,x2,…,xix_1, x_2, \dots, x_i。

状态

dp(i)表示前i个序列中的上升子序列最长长度

状态转移方程

dp(i)=max(dp(i),dp(j)+1)ifj<i,A[j]<A[i]

dp(i) = max(dp(i), dp(j) + 1) \; \mbox{if} \; j

初始化条件

01 for i <- 1 to n
02  dp[i] <- 1

算法实现

const int MAX_NUM = 10000 + 5;
const int INF = 100000000;
// 序列长度
int n;
// 序列
int seq[MAX_NUM];
//  dp(i)表示前i个序列中的上升子序列最长长度
int dp[MAX_NUM];void solve() {int ans = -INF;// 初始化for(int i = 1; i <= n; i++) {dp[i] = 1;}for(int i = 2; i <= n; i++) {for(int j = 1; j < i; j++) {// 如果相邻元素能相等的话,将<改成<=就行了if(seq[j] < seq[i]) {dp[i] = max(dp[i], dp[j] + 1);}if(ans < dp[i]) {ans = dp[i];}}}// 获取最长序列编号int num = ans;int ls[num];for(int i = n; i >= 1; i--) {if(num == dp[i]) {ls[--num] = i;}}for(int i = 0; i < ans; i++) {cout << ls[i] << " ";}cout << endl;cout << ans << endl;
}

测试主程序

#include <iostream>
#include <algorithm>using namespace std;const int MAX_NUM = 10000 + 5;
const int INF = 100000000;
// 序列长度
int n;
// 序列
int seq[MAX_NUM];
//  dp(i)表示前i个序列中的上升子序列最长长度
int dp[MAX_NUM];void solve() {int ans = -INF;// 初始化for(int i = 1; i <= n; i++) {dp[i] = 1;}for(int i = 2; i <= n; i++) {for(int j = 1; j < i; j++) {// 如果相邻元素能相等的话,将<改成<=就行了if(seq[j] < seq[i]) {dp[i] = max(dp[i], dp[j] + 1);}if(ans < dp[i]) {ans = dp[i];}}}// 获取最长序列编号int num = ans;int ls[num];for(int i = n; i >= 1; i--) {if(num == dp[i]) {ls[--num] = i;}}for(int i = 0; i < ans; i++) {cout << ls[i] << " ";}cout << endl;cout << ans << endl;
}int main() {while(cin >> n && n) {for(int i = 1; i <= n; i++) {cin >> seq[i];}solve();}return 0;
}

输出数据

6
1 6 2 3 7 5
1 3 4 6
4
5
1 2 3 1 2
1 2 3
3
5
3 1 2 1 0
2 3
2
5
10 9 8 7 6
5
1Process returned 0 (0x0)   execution time : 106.836 s
Press any key to continue.

动态规划——最长上升子序列问题(LIS)相关推荐

  1. 动态规划-最长上升子序列(LIS)

    这题目是经典的DP题目,也可叫作LIS(Longest Increasing Subsequence)最长上升子序列 或者 最长不下降子序列.很基础的题目,有两种算法,复杂度分别为O(n*logn)和 ...

  2. 动态规划 —— 最长递增子序列(LIS)

    LIS:Longest Increasing Subseq,最长递增子序列,是不要求该子序列在原始序列中间连续存放的. 为了降低对这一问题的理解难度,既然最长递增子序列不要求子序列位置连续,我们不妨先 ...

  3. 最长上升子序列_动态规划 最长上升子序列LIS

    问题描述 最长上升子序列(LIS): 给定长度为n的序列,从中选中一个子序列,这个子序列需要单调递增,请问最长子序列(LIS)的长度? eg:1,5,2,3,11,7,9 则LIS序列为:1,2,3, ...

  4. 最长上升子序列(LIS)问题的解决及优化

    1.LIS:最长上升子序列问题 LIS问题的描述为:给定一个整数序列array,找到它的所有严格递增子序列中最长的序列,输出其长度. 例:10 9 2 5 3 7 101 18 它的最长上升子序列有: ...

  5. 最长递增子序列(LIS)

    最长递增子序列(LIS) 问题描述: 求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的,即留"空". 例如:4 2 3 1 5 的最长递增子序列为 2 3 5,长度 ...

  6. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  7. 详解动态规划最长公共子序列--JavaScript实现

    前面两篇我们讲解了01背包问题和最少硬币找零问题.这篇将介绍另一个经典的动态规划问题--最长公共子序列.如果没看过前两篇,可点击下面链接. 详解动态规划最少硬币找零问题--JavaScript实现 详 ...

  8. 动态规划1--最长公共子序列

    动态规划1--最长公共子序列 一.动态规划 经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题.简单地采用把大问题分解成子问题,并 综合子问题的解导出大问题的解的方法,问题求解耗时 ...

  9. 最长上升子序列问题 (LIS)

    最长上升子序列问题(LIS): 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ..., aN),我们可以 ...

最新文章

  1. 一个让Python代码运行更快的最佳方式!
  2. JSP项目_Web路径_磁盘物理路径
  3. 网友收集了三年的最好的设计网站
  4. 中小SAP项目中的人员编制
  5. 原理详解与标准解法——蓝桥杯_2016年省赛B组 第七题 剪邮票(暴力+迷宫变形)
  6. python数据可视化的特点_Python数据可视化, 看这一篇就够了
  7. ASP.NET Core MVC with EF Core-迁移
  8. python 用selenium自动启动百度并搜索关键词
  9. mac bochs 调试linux,Mac OS X下编译安装带debugger的bochs
  10. vmclone 问题
  11. 【java学习之路】(java SE篇)002.java SE基础语法
  12. 手把手安装flownet2-pytorch
  13. java工程package红叉_Java程序中没有错,项目上面显示一个红叉的解决办法
  14. Java数组索引越界异常
  15. 聊一聊固态硬盘的那些事
  16. 在树莓派上创建区块链节点
  17. 电子封装行业市场专项调查分析
  18. 怎么更改电脑桌面文件存放路径
  19. (LInux)network网卡重启失败原因及解决方法
  20. [Spring]什么是IOC-好莱坞原则

热门文章

  1. 更新mac系统中homebrew的源,更改为清华大学的源
  2. DLL/OCX文件的注册与数据执行保护DEP
  3. 不重启docker容器修改 容器中的时区
  4. JavaScript使用正则表达式进行邮箱表单验证实例
  5. selenium+chromeheadless爬取网站
  6. 斯坦福所倡导的设计思维_针对高科技项目的有效开发商倡导
  7. JavaScript ES2019的新增功能
  8. ubuntu安装sqoop1.4.7
  9. 利用 Python 写个七夕表白神器
  10. (实战项目一)手机App抓包爬虫