/*
* MaxIncresingSubSequeuce.cpp
*
* Created on: 2012-6-24
* Author: jiyiqin
*
* 最长递增子序列,比如1,-1,2,-3,4,-2,6,-5, 返回 1,2,4,6,长度为4
*
*/
#include <iostream>
using namespace std;
class MaxIncresingSubSequence{
public:
/**
* 动态规划:
* 求解a[0...i]的最长递增子序列的问题可以转换成求解a[0...i-1]的最长递增子序列的问题
* 我们将LIS[i]表示以a[i]结尾的最长递增子序列的长度
*
* 那么在求解LIS[i]的时候,就会想到如果a[i]大于a[0...i-1]的最长递增子序列的最大元素的话,
* 那么就将a[i]算进去,如果不是,则看其他子序列有没有最大元素比a[i]小的,将a[i]算到该序列中去。
*
* LIS[i] = max{LIS[k] + 1, 1}, 其中0<=k<i.
* 要么加到某个子序列中,要么自己组成一个新的子序列(最小元素)
* */
static void m_subSequence(int a[], int size){
/* 将所有元素的最长递增子序列长度初始化为1 */
int *lis = new int[size];
for(int i=0;i<size;i++){
lis[i] = 1;
}
/* 以a[i]的索引i作为循环索引 */
for(i=0;i<size;i++){
/* 从前面已经求出的lis值里面找一个最大元素比我小,并且长度最长的 */
for(int j=0;j<i;j++){
if(a[j] < a[i] && ((lis[j] + 1) > lis[i])){
lis[i] = lis[j] + 1;
}
}
}
/* 输出以所有元素结尾的最长递增子序列长度 */
for(i=0;i<size;i++){
cout<<lis[i]<<" ";
}
cout<<endl;
/**
* 优化:每次求解LIS[i]的时候,往前寻找满足条件(尾部小于a[i],长度更新后更大)的子序列都是
* 顺序扫描,其实我们可以快速找到满足条件的那些LIS[k],比如对LIS[]排序。
* 申明一个数组maxV[],maxValue[i]表示长度为i的递增子序列的尾部的值。
* */
}
static void testLIS(){
int a[10] = {1,-1,2,-3,4,-2,6,-5,10,3};
m_subSequence(a, 10);
}
};
int main(){
MaxIncresingSubSequence::testLIS();
return 0;
}
分享到:
相关推荐
这是我这两天才完成的原创代码,就是比较经典的求一个随机序列的最长递增子序列问题。例如: n=5 随机序列为 5 1 4 2 3,正确输出为1 2 3,即长度为3的递增子序列。里面附带实验详细说明,感兴趣的可以下来参考。 ...
求一个由n个整数组成的整数序列的最长递增子序列。一个整数序列的递增子序列可以是序列中非连续的数按照原序列顺序排列而成的。 最长递增子序列是其递增子序列中长度最长的。
求解最大子序列、最长递增子序列、最长公共子串、最长公共子序列. http://blog.csdn.net/ssuchange/article/details/17341693
动态规划最长递增子序列 已经实现 请大家赐教
最长子序列 什么是最长递增子序列呢? 问题描述如下: 设L=,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=,ak2,…,akm>,其中k1…且aK1…。求最大的m值
最长递增子序列LCS的实现C源码,大学算法导论课程实验
中科大软件学院 算法导论课程实验 正式题目二 最长递增子序列 Visual Studio 2012 项目包 使用4种不同的方法实现最长递增子序列
最长递增子序列问题是一个很基本、较常见的小问题,但这个问题的求解方法却并不那么显而易见,需要较深入的思考和较好的算法素养才能得出良好的算法。由于这个问题能运用学过的基本的算法分析和设计的方法与思想,...
算法课实验代码,包括整数划分、各类排序、最长递增子序列、幻方矩阵等试验
贪心算法、动态规划实现最长递增子序列的求取(MFC编程)。
动态规划:最长单调递增子序列 A numeric sequence of ai is ordered if a1 (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK), where 1 , sequence (1, 7, 3, 5, 9, 4, 8) has ordered subsequences, e. ...
中科大软件学院 算法导论课程实验 正式题目二 最长递增子序列 实验报告 使用4种不同的方式实现最长递增子序列
中国科学技术大学软件学院《算法设计与分析》实验题目四
给你一个整数数组 nums ,找到...解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2: 输入:nums = [0,1,0,3,2,3] 输出:4 示例 3: 输入:nums = [7,7,7,7,7,7,7] 输出:1 参数范围: 1 -104 [i] <=104
最长递增子序列的另外一种C语言实现代码,大学算法导论课程实验
C++的课程作业,一个简单的程序,用dev就能直接运行,老师应该不会太仔细检查,糊弄一下肯定没事的,不过最好能自己看懂就是了
包括排序 最长递增子序列 红黑树三个相关程序
这是递增子序列的java实现版 希望对大家有所启迪