zoukankan      html  css  js  c++  java
  • dp--最长上升子序列LIS

    1759:最长上升子序列

    描述
    一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1a2, ..., aN),我们可以得到一些上升的子序列(ai1ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

    n方作法:
    dp[i]表示以i为结尾,所形成的最长上升自序列
    每次当[i]>a[j]的时候,即说明j可以放在a的后面
    dp[i] = max(dp[j]+1,dp[i])
    1     for (int i = 1;i <= n;i++)
    2         for (int j = 1;j <= i-1;j++)
    3         {
    4             if (a[j]<a[i]) 
    5             dp[i] = max(dp[j]+1,dp[i]);
    6         }

     

    完整代码:

     1 #include <cstdio>
     2 #include <iostream>
     3 using namespace std;
     4 int dp[1010];
     5 int main()
     6 {
     7     int n;
     8     int a[1010];
     9     scanf ("%d",&n);
    10     int dp[1010];
    11     for (int i = 1;i <= n;i++)
    12     {
    13         scanf ("%d",&a[i]);
    14         dp[i] = 1;
    15     }
    16     for (int i = 1;i <= n;i++)
    17         for (int j = 1;j <= i-1;j++)
    18         {
    19             if (a[j]<a[i]) 
    20             dp[i] = max(dp[j]+1,dp[i]);
    21         }
    22     int ans=0;
    23     for (int i =1 ;i <= n;i++)
    24         ans=max(dp[i],ans);
    25     cout<<ans;
    26     return 0;
    27 }

     nlogn作法:

     1     for (int i = 1;i <= n;i++)
     2     {
     3         if (c[num]<a[i])
     4             c[++num]=a[i];
     5         else 
     6         {
     7             int pos=lower_bound(c+1,c+num+1,a[i])-c;
     8             c[pos]=a[i];
     9         }
    10     }
    11     printf ("%d",num);

     

  • 相关阅读:
    VS.NET的新用途
    ASP.NET缓存引起的问题
    增加了查看最新回复功能
    高级浏览功能可以使用了
    转载JGTM'2004 [MVP]的文章
    首页文章字数统计改进
    请推荐好的工作流产品
    不错的工具:Reflector for .NET
    寻找文件同步软件
    javascript引起博客园首页不能显示问题说明
  • 原文地址:https://www.cnblogs.com/very-beginning/p/12001046.html
Copyright © 2011-2022 走看看