zoukankan      html  css  js  c++  java
  • ny214 单调递增子序列(二) 动态规划

    单调递增子序列(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
    描述

    给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

    如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

    输入
    有多组测试数据(<=7)
    每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
    数据以EOF结束 。
    输入数据保证合法(全为int型整数)!
    输出
    对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
    样例输入
    7
    1 9 10 5 11 2 13
    2
    2 -1
    样例输出
    5
    1
    常规方法,会超时的,AC代码一:
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        int b[100010],a[100010];
        int i,j,n,t,max;
        while(scanf("%d",&t)!=EOF)
        {    max=0;
            memset(b,0,sizeof(b));
            for(i=0;i<t;i++)
                scanf("%d",&a[i]);
            b[0] = a[0];
            for(i = 1, j = 1; i < t; i++)
            {
            
                if(a[i]> b[j-1])//判断如果出现后面的有大于前面的数就保存起来;
                    b[j++] = a[i];//保存的同时,j的值也在不断的增大,当保存到最后,j的值就是最后的最大长度了;
                else{
                    for(int k = 0; k < j; k++)
                    {
                        if(a[i] < b[k]){
                            b[k] = a[i];
                            break;
                        }
                    }
                }
            }
            printf("%d
    ",j);
        }
        return 0;
    }

    AC代码二:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 using namespace std;
     5 int dp[100010];
     6 int main()
     7 {
     8     int i,a,t,k,j,n,mm;
     9     while(scanf("%d",&n)!=EOF)
    10     {  k=1;memset(dp,0,sizeof(dp));mm=0;
    11            cin>>dp[0];
    12         for(i=1;i<n;i++)
    13         {
    14             scanf("%d",&a);
    15             if(a<dp[0])
    16                 dp[0]=a;
    17               else if(a>dp[k-1])
    18                      dp[k++]=a;
    19               else
    20               {
    21                  for(j=1;j<k;j++)
    22                     {
    23                       if(a<dp[j] && a>dp[j-1])
    24                         {dp[j]=a;break;}
    25                       else  if(a<dp[j])
    26                             break;
    27                     }
    28                }
    29         }
    30         cout<<k<<endl;
    31     }
    32     return 0;
    33 
    34 }

    超时的代码:

    #include<stdio.h>
    #include<string.h>
    //int b[100010]={0};
    int main()
    {
        int a[100010],b[100010];
        int i,j,n,t,max;
        while(scanf("%d",&t)!=EOF)
        {max=0;
            memset(b,0,sizeof(b));
            scanf("%d",&a[0]);
            for(i=1;i<t;i++)
            {
                scanf("%d",&a[i]);
                for(j=0;j<i;j++)
                    if(a[i]>a[j] && b[j]+1>b[i])
                    b[i]++;
                //    printf("%d ",b[i]);
                    if(b[i]>max)
                        max=b[i];
            }
            /*for(i=0;i<t;i++)
            {if(b[i]>max)
            max=b[i];
            }*/
            printf("%d
    ",max+1);
        }
        return 0;
    }


  • 相关阅读:
    crs_stop 错误一列
    本地管理表空间和字典管理表空间的特点,ASSM有什么特点
    RAC 11.2的新特性
    oracle 11g RAC 的一些基本概念(三)
    【1】【leetcode-130】 被围绕的区域
    【leetcode-125】 验证回文串
    【1】【leetcode-127】单词接龙word-ladder
    【1】【leetcode-115】 不同的子序列 distinct-subsequences
    【1】[leetcode-124] 二叉树中的最大路径和
    [leetcode-128] 最长连续序列
  • 原文地址:https://www.cnblogs.com/lovychen/p/3240323.html
Copyright © 2011-2022 走看看