poj 2533 LIS(最长上升子串)入门
问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。输出这个最长的长度。
例如有一个序列:1 7 3 5 9 4 8,它的最长上升子序列就是 1 3 4 8 长度为4
解题思路:
用A[]存储输入的数。D[i]表示以i结束所能得到的最大上升字串,对于每个i,遍历1<=j<i;如果A[i]>A[j] && D[i]<=D[j],则表明A[i]可以加入到A[j]后面,则D[i]=D[j]+1;
然后再求D[]中的最大值。输出。时间复杂度O(n^2)。
/* * ===================================================================================== * * Filename: main.cpp * * Description: poj 2533 * * Version: 1.0 * Created: 2012/5/10 22:19:21 * Revision: none * Compiler: gcc * * Author: Jason Damon * Organization: XD University * * ===================================================================================== */ #include <stdlib.h> #include <iostream> #include <fstream> #define MAX(a,b) (a>b?a:b) using namespace std; #define MAXN 1005 int A[MAXN],D[MAXN]; int N; int main() { int i,j,ans; freopen("in.txt","r",stdin); while(scanf("%d",&N)!=EOF) { for(i=1; i<=N; i++) { scanf("%d",&A[i]); } D[1]=1; for(i=2; i<=N; i++) { for(j=1; j<i; j++) { if(A[i]>A[j] && D[i]<=D[j]) { D[i]=D[j]+1; } } D[i]=MAX(1,D[i]); //必须判断一次,如果不比A[j]大,则D[i]=1; } ans=1; for(i=2; i<=N; i++) { ans=MAX(ans,D[i]); } printf("%d\n",ans); } return 0; }
我是一名在校大学生,热爱编程,虽然起步晚了些,但我会努力的。呵呵!
数据结构 算法