1. 最长递增子序列

不要求位置连续;要求大小严格递增(strictly increasing)

  • 穷举法解题

    首先以每个数字为单位分割寻找最长递增子序列;

    int lis(const vector<int>& A){
    if (A.size() == 1) return 1;
    int ret = 0;
    for (int i = 0; i < A.size()-1; ++i){
    if (A[i] < A[i+1]) {
    vector<int> B(A.begin()+(i+1), A.end());
    ret = max(ret, 1+lis(B));
    }
    }
    return ret;
    }
  • 动态规划:修正输入值

    上述代码虽然能够非常优秀地完成穷举搜索算法,但很难适用于动态规划制表的方法。最直接的原因在于输入值并非可索引的整数,而本身即为整数型数组。当然可以像 STL 的关联数组 map 实现制表的方法,但运算速度效率很低。
    因此可将本题转化为可最优化(子问题的最优解也是全局的最优解)的动态规划问题。
    int cache[100];
    vector<int> A;
    int lis_dp(int s){
    if (s == A.size() - 1) return 1;
    int& ret = cache[s];
    if (ret != -1) return ret;
    for (int skip = s+1; skip < A.size(); ++skip){
    if (A[s] < A[skip])
    ret = max(ret, 1+lis_dp(skip));
    }
    return ret;
    }

    注意,到这并不算完,还需要:

    int maxLen = 0;
    for (int begin = 0; begin < n; ++begin)
    maxLen = max(maxLen, lis_dp(begin));

    在调用端,总是需要指定递增子序列的起始位置,使用该函数将该函数的使用置于一个循环体内。

动态规划求解序列问题(LIS、JLIS)的更多相关文章

  1. 0-1背包问题——动态规划求解【Python】

    动态规划求解0-1背包问题: 问题:背包大小 w,物品个数 n,每个物品的重量与价值分别对应 w[i] 与 v[i],求放入背包中物品的总价值最大. 动态规划核心:计算并存储小问题的最优解,并将这些最 ...

  2. 【BZOJ 1049】 1049: [HAOI2006]数字序列 (LIS+动态规划)

    1049: [HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变 ...

  3. Python动态规划求解最长递增子序列(LIS)

    原始代码错误,移步博客查看O(N^2)及优化的O(N*logN)的实现:每天一道编程题--最长递增子序列

  4. 【ACM程序设计】动态规划 第二篇 LCS&LIS问题

    动态规划 P1439 [模板]最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给出 1,2,-,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列. ...

  5. 【BZOJ】1049: [HAOI2006]数字序列(lis+特殊的技巧)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1049 题意:给一个长度为n的整数序列.把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希 ...

  6. 背包问题(Knapsack problem)采用动态规划求解

    问题说明: 假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号.单价与重量如下所示:0李子4KGNT$45001苹果5KGNT$57002橘子2 ...

  7. hdu 5256 序列变换 (LIS变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. 最长上升序列 LCS LIS

    子序列问题 (一)一个序列中的最长上升子序列(LISLIS) n2做法 直接dp即可: ;i<=n;i++) { dp[i]=;//初始化 ;j<i;j++)//枚举i之前的每一个j ) ...

  9. BZOJ1046 [HAOI2007]上升序列 【LIS + 字典序最小】

    1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 5410  Solved: 1877 [Submit][St ...

随机推荐

  1. 怎样用redis实现分布式锁

    引子 redis作为一个强大的key/value数据库.事实上还能够用来实现轻量级的分布式锁. 1.实现方案1 最早官方在SETNX命令页给了一个实现: acquire lock: SETNX loc ...

  2. View State

    如何查看viewstate 鼠标右键页面,然后view page source 源码中搜索viewstate,会找到一个隐藏的字段. <input type="hidden" ...

  3. Python 面向对象与 C++、Java 的异同

    1. 子类是否自动调用父类的构造方法 C++.Java 会在子类对象的构造中自动首先调用父类的构造: Python 则相对啰嗦一点: 如果子类不覆盖父类的__init__()方法,则子类默认将执行与父 ...

  4. Ajax往后台传参数,无参数,一个参数,多个参数,一个对象等

    原文:http://www.cnblogs.com/chenwolong/p/Get.html //无参数请求-简单示例 $(document).ready(function () { $.ajax( ...

  5. 交换工资 SQL

  6. 【Uva 1289】Stacking Plates

    [Link]: [Description] 有n(1≤n≤50)堆盘子,第i堆盘子有hi个盘子(1≤hi≤50),从上到下直径不减.所有盘 子的直径均不超过10000.有如下两种操作. split:把 ...

  7. 海康威视抓拍一体机--- C#源码

    https://pan.baidu.com/s/1kV4AjRp 需要的联系qq:694666781

  8. ORA-01653 无法在表空间扩展的解决办法 -- 增加表空间大小或给表空间增加数据文件

    转自原文 ORA-01653 无法在表空间扩展的解决办法 -- 增加表空间大小或给表空间增加数据文件 当前系统的数据量越来越大的,昨天还运行正常的数据库,突然无法使用了.经过定位发现是"OR ...

  9. heap-adb shell查看堆栈使用

    今天在使用eclipse中的heap查看oom的时候,发现手机(eng版本)非常的卡,后来换成usr版本,又连接不上eclipse.最后听别人说,可以使用adb shell进行查看.指令如下 adb ...

  10. BIND View 加速南北方网络互访

            BIND View 加速南北方网络互访          南北方网络互访的问题一直以来就是广大运维人员的心病,两大网络运营商之间的连接带宽比较有限,跟不上互联网业务发展的速度.如何才能 ...