最长上升子序列LIS
2016-10-04 17:31
295 查看
问题:
给定n个整数A1,A2,A3,A4,A5,….An,从左到右的顺序尽量选出多个整数,组成一个上升子序列,相邻元素不相等。例如:1,6,2,3,7,5,它的最长上升子序列为:1,2,3,5。
分析:
刚开始想这个问题的时候我想用递归来解决问题,可是后来考虑到递归的时间复杂度高,就觉得不能使用,并且本来就是在刷dp啊。想来很久,无果。在网上一看分析,就懂了。还是太菜啊。具体思路,序列很长,我就把它分成一个个很小的一段,不断拆分,当序列只有一个元素时,它的最长子序列为1,要是有两个呢,就得把第二个元素进行比较。所以就得出了想法,就是从考虑终点在哪里的问题,在终点以前已经得到了其最长字序列,就只需考虑最后一个元素的大小关系,这样一来,所以问题都觉解了。最小的子序列就是1,很容易得之,其他的就由最优的子序列不断得到。
代码:
这个方法的时间复杂度为N×N,还有nlog(n)的方法,下次再更新。
给定n个整数A1,A2,A3,A4,A5,….An,从左到右的顺序尽量选出多个整数,组成一个上升子序列,相邻元素不相等。例如:1,6,2,3,7,5,它的最长上升子序列为:1,2,3,5。
分析:
刚开始想这个问题的时候我想用递归来解决问题,可是后来考虑到递归的时间复杂度高,就觉得不能使用,并且本来就是在刷dp啊。想来很久,无果。在网上一看分析,就懂了。还是太菜啊。具体思路,序列很长,我就把它分成一个个很小的一段,不断拆分,当序列只有一个元素时,它的最长子序列为1,要是有两个呢,就得把第二个元素进行比较。所以就得出了想法,就是从考虑终点在哪里的问题,在终点以前已经得到了其最长字序列,就只需考虑最后一个元素的大小关系,这样一来,所以问题都觉解了。最小的子序列就是1,很容易得之,其他的就由最优的子序列不断得到。
代码:
#include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define INF 10000 int ar[INF]; int br[INF]; int N,MaxLen; int main() { cin>>N; MaxLen=0; memset(br,1,sizeof(br)); for(int i=1;i<=N;i++) cin>>ar[i]; //输入给定的数组 for(int i=1;i<=N;i++) br[i]=1; //表示第i个元素的最长长度 if(N==1) { cout<<1<<endl; return 0; } for(int i=2;i<=N;i++) { int maxx=0; //表示最优子结构的最大值 for(int j=1;j<=i-1;j++) //比较终点ar[i]是否加入最长子结构中 if(ar[j]<ar[i]&&br[j]>=maxx) maxx=br[j]; br[i]=maxx+1; if(br[i]>MaxLen) MaxLen=br[i]; } cout<<MaxLen<<endl; return 0; }
这个方法的时间复杂度为N×N,还有nlog(n)的方法,下次再更新。
相关文章推荐
- HDU 1025 Constructing Roads In JGShining's Kingdom(LIS最长上升子序列)
- [Treap] [LIS] BZOJ[3173] [Tjoi2013]最长上升子序列
- POJ 2533 Longest Ordered Subsequence(LIS:最长上升子序列)
- LIS求解最长上升子序列问题
- poj1631 dp 最长上升子序列LIS
- POJ - 3903 Stock Exchange(LIS最长上升子序列问题)
- 最长上升子序列(LIS)
- Longest Increasing Subsequence[LIS 最长上升子序列问题] (Longest Ordered Subsequence) POJ - 2533 队列优化
- SDUSTOJ 1800 LIS(最长上升子序列不同位置个数)
- 最长上升子序列问题LIS
- POJ 1631 Bridging signals(LIS:最长上升子序列)
- Leetcod-300_最长上升子序列LIS-基础动态规划问题-【C++】
- Monkey and Banana(LIS最长上升子序列)
- 算法练习--- DP 求解最长上升子序列(LIS)
- LIS(最长上升子序列)模板
- 最长上升子序列LIS集合 POJ2533,POJ1631,POJ1887,POJ1609
- 最长公共上升子序列(LIS)
- SDUSTOJ 1801 LIS2(最长上升子序列不同值的数量)
- 南阳 1042 Tamama的排序游戏(最长上升子序列LIS)
- 最长上升子序列(LIS)长度的O(nlogn)算法