【蓝桥杯-动态规划】 Longest Ordered Subsequence

问题链接:ZOJ2136 Longest Ordered Subsequence

问题简述:参见上述问题描述

大致思路

首先要想到是动态规划问题。如何想到?你肯定要遍历,去找从开头到当前数的递增序列的数的个数,是取决于该递增序列在你前面那个(次大)数的最长递增序列的数的个数+1. 而且你想嘛,每个数对应一个个数值,应该是用数组来遍历的,这就更符合动态规划了。

然后你就想dp数组值表示的是啥?应该是所求——递增序列的数的个数(所求是最长,最后求个最大值即可)。

那么,dp选几维?一维。

dp下标表示啥?刚开始我想成表示元素的大小值了(因为想着去比较大小),后来在声明dp数组时觉得不对,突然发现其实dp下标应该表示给你的数组下标。

状态转移方程咋整?很简单,需要找到上一个比我小的数,然后把它的dp值+1.

关键部分bingo

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;


int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int t;
		cin>>t;
		int a[t];
		for(int i=0;i>a[i];
		}
		int dp[t];
		dp[0]=1;
		for(int i=1;i=0;j--)
			{
				if(a[j]


备注:上面这个算法时间复杂度为O(n^2),而其实求最长上升子序列可以只要O(nlogn),内层用到二分法。

原理待搞懂。

参考链接:http://blog.csdn.net/tigerisland45/article/details/72850070

你可能感兴趣的:(LeetCode)