博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法概论】动态规划:最长递增子序列
阅读量:4177 次
发布时间:2019-05-26

本文共 1604 字,大约阅读时间需要 5 分钟。

最长递增子序列(Longest increasing subsequences)

问题描述:

       the input is a sequence of numbers a1, a2, ……, an. A subsequence is any subset of these numbers taken in order, of the form ai1, ai2, ……, aik where 1 <= i1 <= i2 <= … ik <= n, and an increasing subsequence is one in which the numbers are getting strictly larger.(标蓝的数字均为下标)

The task is to find the increasing subsequence of greatest length. For instance, the longest increasing subsequence of 5, 2, 8, 6, 3, 6, 9, 7 is 2, 3, 6, 9.

❗算法思想❗:

       定义 lis[i] 为截至到第 i 个数字为止,最长递增子序列的长度,path[i] 为截至到第 i 个数字为止,最长递增子序列中 i 的前一个元素。

       初始状态:lis[0] = 1;

       决策方程: lis[i] = max( if (lis[i] > lis[j]), lis[i] = lis[j] + 1; else, lis[i] = lis[j+1]);

       问题解:lis[k], k = lenght - 1。

代码✍:

#include 
#include
using namespace std;int main(){ vector
seq; //输入序列 while (1) { int temp; cin >> temp; seq.push_back(temp); char tmp = getchar(); if (tmp == '\n') { break; } } int length = int(seq.size()); vector
lis(length); //lis[i]存储以seq[i]为终点时最长递增子序列的大小 vector
path(length); //path[i]存储以seq[i]为终点时最长递增子序列的上一个数字 int Lis[2] = {1, 0}; //Lis[0]存储最长递增子序列的长度,Lis[1]存储最长递增子序列终点数的下标 for (int i = 0; i < length; ++i) { //将lis数组初始化为1 lis[i] = 1; //将path数组初始化为下标值 path[i] = i; for (int j = 0; j < i; ++j) { if (seq[i] > seq[j]) { if (lis[j] + 1 > lis[i]) { lis[i] = lis[j] + 1; path[i] = j; } } } if (lis[i] > Lis[0]) { Lis[0] = lis[i]; Lis[1] = i; } } //输出最长递增子序列(这是倒序输出的!) int i = Lis[1]; cout << seq[i] << ' '; while (path[i] != i) { cout << seq[path[i]] << ' '; i = path[i]; } return 0;}

 

转载地址:http://lttai.baihongyu.com/

你可能感兴趣的文章
Apache Maven项目提供的JAR插件详解
查看>>
Apache Maven项目提供的WAR插件详解
查看>>
Apache Maven项目提供的EAR插件详解
查看>>
从JBoss Seam 2.x迁移到JavaEE 7之一:组件模型
查看>>
从JBoss Seam 2.x迁移到JavaEE 7之二:组件的有效范围Scope
查看>>
从JBoss Seam 2.x迁移到JavaEE 7之三:对象的注入
查看>>
从JBoss Seam 2.x迁移到JavaEE 7之四:事件机制
查看>>
Java 1.5并发包之一:Lock
查看>>
Java 1.5并发包之二:任务与线程池
查看>>
Java 1.5并发包之三:线程池实现之Fork/Join框架
查看>>
Java多线程同步方法的概述
查看>>
Java IO概述
查看>>
Java NIO概述
查看>>
Java中synchronized与volatile的区别与联系
查看>>
volatile与synchronized在Java单例模式中的应用
查看>>
Hibernate 5.1概述
查看>>
Hibernate数据类型及JPA的Entity类与Hibernate的Entity类的区别
查看>>
Hibernate中的Entity类未必final
查看>>
Hibernate中的Entity类中的无参数构造函数
查看>>
Hibernate中的Entity类中的getter/setter方法
查看>>