【POJ-2533】Longest Ordered Subsequence

87 阅读1分钟
题意

求最长递增子序列长度

 

样例
Sample Input
7
1 7 3 5 9 4 8


Sample Output
4

 



 

AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;

//数组的声明给如果不是全局的或者static的, 会造成内存泄漏
//报错信息 :  Process returned -1073741571 (0xC00000FD)
int a[1002];
int L[1002];                   //存储最长非递增子序列的长度
int x[1002][1002];               //存储对应的最长非递增子序列
int n;

void IncreaseOrder(int a[], int n)
{
	int i, j, k, index;
	for (i = 0; i < n; i++)       //初始化,最长递增子序列长度为1
	{
		L[i] = 1;
		x[i][0] = a[i];
	}
	for (i = 1; i < n; i++)
	{
		int max = 1;
		for (j = i - 1; j >= 0; j--)            //寻找某个数之前,看能否找到递增序列
		{
		     //如果改成a[j]>a[i],则就是计算最长非递增子序列
			if ((a[j]<a[i]) && (max<L[j] + 1))//满足递增条件且长度小于之前的序列长度
			{
				max = L[j] + 1;
				L[i] = max;                    //储存最大长度
				for (k = 0; k<max - 1; k++)//储存最长递增子序列
				{
					x[i][k] = x[j][k];
				}
				x[i][max - 1] = a[i];
			}
		}
	}
	for (index = 0, i = 1; i<n; i++)    //求递增子序列的最大长度
	{
		if (L[index] < L[i])
			index = i;
	}
	cout << L[index] << endl;     //输出最大长度

}
int main()
{
    cin>>n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	IncreaseOrder(a, n);
}

 

题源:poj.org/problem?id=…