• 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;
    }


  • 相关阅读:
    Java输出错误信息与调试信息
    Java实现两个变量的互换(不借助第3个变量)
    Java用三元运算符判断奇数和偶数
    使用webpack-dev-server设置反向代理解决前端跨域问题
    springboot解决跨域问题(Cors)
    Spring boot集成swagger2
    Redis学习汇总
    【年终总结】2017年迟来的总结
    Springboot项目maven多模块拆分
    Maven实现多环境打包
  • 原文地址:https://www.cnblogs.com/lovychen/p/3240323.html
Copyright © 2020-2023  润新知