POJ 2533 Longest Ordered Subsequence 题解

原题链接

题如其名,最长上升子序列裸题

分析:

dp[i]表示从第1项到第i项,且以第i项作为子序列结尾的最长上升子序列长度
有转移方程:
dp[i]=max(dp[i],dp[k]+1)
条件:a[k] < a[i] (也就是说第i项可以接在第k项的后面)
初始全部是1 (再不济也可以含上他自己吧)

代码实现

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1005;
int main(){
    int n;
    cin>>n;
    int a[n+5];
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int dp[n+5];
    for(int i=1;i<=n;i++)
        dp[i]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<i;j++)
            if(a[j]<a[i])
                dp[i]=max(dp[i],dp[j]+1);
    int ans=0;
    for(int i=1;i<=n;i++)
        ans=max(ans,dp[i]);
        //cout<<dp[i]<<" ";
    cout<<ans;
    return 0;
}

By YOUSIKI

你可能感兴趣的:(dp,poj)