codevs 1576 最长严格上升子序列(DP)

来源:互联网 发布:韩磊花房姑娘知乎 编辑:程序博客网 时间:2024/05/16 14:30

题目描述 Description
给一个数组a1, a2 … an,找到最长的上升降子序列ab1 < ab2< .. < abk,其中b1< b2<..bk。
输出长度即可。

输入描述 Input Description
第一行,一个整数N。
第二行 ,N个整数(N < = 5000)

输出描述 Output Description
输出K的极大值,即最长不下降子序列的长度

样例输入 Sample Input
5
9 3 6 2 7

样例输出 Sample Output
3

数据范围及提示 Data Size & Hint
【样例解释】
最长不下降子序列为3,6,7

题解:一道DP水题

代码如下

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int a[1100];int dp[1100];//dp[i]表示到第i位为止的最长上升子序列长度 int main(){    int n,maxn=0,temp=0;    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        dp[i]=1;//初始化     }    for(int i=2;i<=n;i++)    {        for(int j=1;j<=i;j++)            if(a[j]<a[i]&&(dp[j]+1)>maxn)                maxn=dp[j]+1;        dp[i]=max(maxn,dp[i]);//简单的转移方程         maxn=0;    }    for(int i=1;i<=n;i++)        if(dp[i]>temp) temp=dp[i];//找最大值     printf("%d",temp);    return 0;}
3 0