zoukankan      html  css  js  c++  java
  • 最长非上升子序列的长度

      最长非上升子序列问题是一个经典的DP问题。如下给出完整的问题描述:

      给你一串序列 A1,A2,A3,A4,A5........An。让你找出它的某个最长子序列 S1,S2,S3,S4.........Sm。使得 S1<=S2<=S3<=S4.........<=Sm。

    从问题描述中,我们可以把 <= 换成各种其他的关系符号从而变成最长非下降子序列等,他们都只是关系描述不同,其本质都是一样的。现在,我们来只需总结一下最长非上升子序列问题即可应用到其他类型。

      这既然是一个经典的DP问题,那么找出他的状态转移方程显然是必须的。首先,我们用dp[i]来表示 1--i 的最长非上升子序列的长度。那么dp[i]=Max(dp[j])+1,j∈[1, i-1]。显然dp[1]=1。那么去哦们只需从第二项开始遍历即可。

    算法描述如下:

    1.dp[1] = 1;

    2.依此遍历整个序列,每次求出从第一项到当前项的最长子序列长度。

    3.找dp数组里最大的那个就是整个序列的最长子序列长度。

    算法复杂度为:O(n^2)

     1 int Num[N];
     2 int dp[N];
     3 
     4 int Lis(int n)
     5 {
     6     memset(dp, 0, sizeof dp);
     7     int ans;
     8     dp[0] = 1;
     9     for(int i=1; i<n; i++)
    10     {
    11         ans = dp[i];
    12         for(int j=0; j<i; j++)
    13             if(Num[i] <= Num[j] && dp[j]>ans)
    14                 ans = dp[j];
    15         dp[i] = ans+1;
    16     }
    17     ans = 0;
    18     for(int i=0; i<n; i++)
    19         if(dp[i] > ans)
    20             ans = dp[i];
    21     return ans;
    22 }
  • 相关阅读:
    华为设备SNMP配置
    Linux CP直接覆盖快速操作
    CentOS7快速安装PHP7.0指南
    Linux SSH免密码登录配置
    this的指向
    分页的模块layui
    multer中间件
    ajax实现图片上传
    MVC模式、加密、jsonwebtoken
    mongoose与express
  • 原文地址:https://www.cnblogs.com/khan724/p/4143488.html
Copyright © 2011-2022 走看看