• tyvj 1049 最长不下降子序列 n^2/nlogn


    P1049 最长不下降子序列
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    求最长不下降子序列的长度

    输入格式

    第一行为n,表示n个数
    第二行n个数

    输出格式

    最长不下降子序列的长度

    测试样例1

    输入


    1 2 3

    输出

    3

    备注

    N小于5000
    for each num <=maxint
     
    题意:中文题意
     
    题解:不下降也就是>=
     
    n^n  dp[i] 表示以a[i]结尾的最长不下降子序列的长度
     1 /******************************
     2 code by drizzle
     3 blog: www.cnblogs.com/hsd-/
     4 ^ ^    ^ ^
     5  O      O
     6 ******************************/
     7 //#include<bits/stdc++.h>
     8 #include<iostream>
     9 #include<cstring>
    10 #include<cstdio>
    11 #include<map>
    12 #include<algorithm>
    13 #include<cmath>
    14 #define ll long long
    15 #define PI acos(-1.0)
    16 #define mod 1000000007
    17 using namespace std;
    18 int n;
    19 int a[5005];
    20 int dp[5005];
    21 int main()
    22 {
    23     while(~scanf("%d",&n)){
    24     memset(dp,0,sizeof(dp));
    25     for(int i=1;i<=n;i++)
    26         {
    27             scanf("%d",&a[i]);
    28             dp[i]=1;
    29         }
    30     int maxn=1;
    31     int ans=0;
    32     for(int i=1;i<=n;i++)
    33     {
    34         maxn=1;
    35         for(int j=1;j<i;j++)
    36         {
    37             if(a[j]<=a[i]&&dp[j]+1>maxn)
    38                 maxn=dp[j]+1;
    39         }
    40         dp[i]=maxn;
    41         ans=max(ans,maxn);
    42     }
    43     cout<<ans;
    44     }
    45     return 0;
    46 }

    nlogn    使用upper_bound 与最长上升子序列不同 注意边界判断

    ans[i]  表示长度为i的最长的不下降的最后一位的值

     1 /******************************
     2 code by drizzle
     3 blog: www.cnblogs.com/hsd-/
     4 ^ ^    ^ ^
     5  O      O
     6 ******************************/
     7 //#include<bits/stdc++.h>
     8 #include<iostream>
     9 #include<cstring>
    10 #include<cstdio>
    11 #include<map>
    12 #include<algorithm>
    13 #include<cmath>
    14 #define ll long long
    15 #define PI acos(-1.0)
    16 #define mod 1000000007
    17 using namespace std;
    18 int n;
    19 int a[5005];
    20 int main()
    21 {
    22     while(~scanf("%d",&n)){
    23     memset(dp,0,sizeof(dp));
    24     for(int i=0;i<n;i++)
    25             scanf("%d",&a[i]);
    26     int maxn=1;
    27     int ans[5005];
    28     int top=1;
    29     ans[1]=a[0];
    30     for(int i=1;i<n;i++)
    31     {
    32        if(a[i]>=ans[top])
    33          ans[++top]=a[i];
    34        else
    35        {
    36            int pos=upper_bound(ans,ans+top,a[i])-ans;//指向大于a[i]的第一个元素的位置
    37            ans[pos]=a[i];//更新
    38        }
    39     }
    40     cout<<top<<endl;;
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    Acwing 284.金字塔 (区间DP)
    Acwing 283.多边形 (区间DP)
    Acwing 277.饼干 (DP+排序不等式)
    Acwing 274.移动服务 (DP)
    Acwing 273.分级 (DP)
    Acwing 271.杨老师的照相排序 (DP)
    Acwing 272.最长公共上升子序列 (DP)
    Mybatis-缓存
    mybatis与spring整合
    mybatis-sql映射文件
  • 原文地址:https://www.cnblogs.com/hsd-/p/5719980.html
Copyright © 2020-2023  润新知