Longest Ordered Subsequence


鹏神意外得到了神灯。

  神灯中冒出了灯神,灯神说道:“我将给你一个有序的数列,你可以在保证原有顺序不变的前提下,挑出任意多的数。如果你挑出的数字是严格升序的,那么这段数字的个数就是你女朋友的个数。”

  “妈的智障。”鹏神骂道。

  但是鹏神还是希望自己能有尽可能多的女朋友。所以他求救于你,希望你能帮他算出他最多能有多少女朋友。

Input

  输入包含多组数据。

  第一行是以为整数N,表示灯神给出的数列的长度。(1≤N≤1000)

  第二行包含N个整数,即是灯神给出的序列。

Output

  对于每组输入数据,请输出最终答案,即鹏神最多可以得到的女朋友个数。

Sample Input

7
1 7 3 5 9 4 8

Sample Output

4

Hint

在样例中,鹏神可以挑出1、3、5、9 或者1、3、5、8,都是4个数字。

算法:

/*题目是求最长上升子序列,DP问题。
a[i]是表示输入的数据,dp[i] 是表示第i个数字和它之前a[0]到a[i-1]的数字构成的最大上升序列的长度值。
例如 七个数字
1 7 3 5 9 4 8   分别存在a[0]到a[6]中。那么对应的dp[0]到dp[6]的值就是
1 2 2 3 4 3 4
dp[0]就是1,本身成一个序列。
dp[1]是2,构成的最长上升子序列是 1 7 .长度为2.
dp[2]是2,构成的最长上升子序列是 1 3 .长度为2.
dp[3]是3,构成的最长上升子序列是 1 3 5 .长度为3.
。。。。。。
 
求出dp数组所有的值,用一个for循环找出最大值,就是题目要求的最长上升子序列的值。
 
由此题可以简单的想到最长下降子序列,只需要改动一个大于号就可以了。
*/
#include<stdio.h>
#include<string.h>
#define MAX 1005
int a[MAX],dp[MAX];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));         //初始化数组。
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        dp[0]=dp[1]=1;
        for(int j=2;j<=n;j++)          //二重循环求dp数组。
        {
            int temp=0;
            for(int i=1;i<j;i++)        
            {
                if(a[i]<a[j])          //  找出在这个数之前比它小的数字。
                {
                    if(temp<dp[i])     
                    {
                        temp=dp[i];    // 找出比这个数字小的数字里的最大的dp值。就是长度值。
                    }
                }
            }
            dp[j]=temp+1;              //加一就是这个数字的dp值。
        }
        int sum=dp[0];
        for(int i=1;i<n;i++)
        {
            if(dp[i+1]>sum)
            sum=dp[i+1];
        }
        printf("%d\n",sum);
    }
    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值