POJ 2533(DP初步_C题)解题报告

题目链接:http://poj.org/problem?id=2533

--------------------------------------------------------

题意:最长上升子序列(LIS),问给出的序列中最长上升子序列的长度为多少。上升子序列:指i>j,a[i]>a[j]。

 

思路:f[i]表示以序列中第i个元素结尾的最长上升子序列的长度。状态转移方程为:if (a[i] > a[j])   f[i] = MAX (f[i], f[j] + 1);

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int MAXN =1e3+10;
int a[MAXN];
int f[MAXN];
int N;
int cmp1(int a,int b){
    return a>b;
}
int main(void){
    scanf("%d",&N);
    for(int i=0;i<N;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<N;i++){
        f[i]=0;
    }
    f[0]=1;
    for(int i=1;i<N;i++){
        int maxfj = 0;
        for(int j=0;j<i;j++){
            if(a[j]<a[i]){
                if(maxfj<f[j]){maxfj=f[j];}
            
            }
        f[i]=maxfj+1;
        }
    }
    sort(f,f+N,cmp1);
    printf("%d\n",f[0]);
    return 0;

}
View Code

 

posted @ 2018-01-30 15:49  caomp  阅读(110)  评论(0)    收藏  举报