Longest Increasing Subsequence

题目描述

有一个序列有N个数,A[1],A[2],A[3],……,A[N],求出最长非降子序列长度。

我们首先我定义一个“状态”来代表它的子问题,并且找到它的解。一般情况下,某个状态只与它前面出现的状态有关,而独立于后面的状态。
假如我们考虑求A[1],A[2],A[3],………,A[i]的最长非降子序列的长度,其中i<N,那么这个问题就是原问题的一个子问题,然后我们定义d(i),表示前i个数中,以A[i]结尾的最长非降子序列的长度。只要我们把d(1)到d(N)都计算出来,那么答案就是这里面最大的那个。现在我们来求状态转移方程。
举一个例子,有如下序列

5,3,4,8,6,7

我们可以得到

  • 前1个数的LIS长度d(1) = 1 (5)
  • 前2个数的LIS长度d(2) = 1 (3)
  • 前3个数的LIS长度d(3) = 2 (3,4 d(3) = d(2)+1)
  • 前4个数的LIS长度d(4) = 3 ( 3,4,8 d(4) = max{d(1),d(2),d(3)}+1)

由上我们可以看出状态转移方程为d(i) = max{d[A[j]}+1 j<i && A[j]<=A[i]。

代码如下

vector<int> nums{5,3,4,8,6,7};
void LIS(vector<int>& nums) {      
        if (nums.empty()) return ;
        vector<int> dp;
        int len = nums.size();
        for (int i = 0;i < len;i++) {
            dp.push_back(1);
        }
        for (int i = 1;i<len;i++) {            
            for (int j=0;j<i;j++) {
                  if (nums[i]>=nums[j] && dp[j]+1>dp[i])
                      dp[i] = dp[j]+1;
            }
        }
        ostream_iterator<int> oo(cout," ");
        copy(dp.begin(),dp.end(),oo);
        return ;  
    }
结果为
1 1 2 3 3 4 

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 动态规划(Dynamic Programming) 本文包括: 动态规划定义 状态转移方程 动态规划算法步骤 最长...
    廖少少阅读 3,338评论 0 18
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 13,748评论 0 89
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,782评论 0 11
  • 逄蒙学射于羿,尽羿之道,思天下惟羿为愈己,於是杀羿。 孟子曰:是亦羿有罪焉。 公明仪曰:宜若无罪焉。 曰:薄乎云尔...
    济之阅读 393评论 0 0
  • 今日阅读:《跟钱钱学理财》前言及第一章 之前已经读过两次《小狗钱钱》,本来想从今天开始再读一遍并整理笔记。结果看到...
    地瓜Zachary阅读 300评论 0 1