http://wikioi.com/problem/1576/

经典的动态规划。我写了个o(n^2)的DP方法。

PPT:http://wenku.baidu.com/view/bd290294dd88d0d233d46ac7.html

线型动态规划问题,最典型的特征就是状态都在一条线上,并且位置固定,问题一般都规定只能从前往后取状态,解决的办法是根据前面的状态特征,选取最优状态作为决策进行转移。
设前i个点的最优值,研究前i-1个点与前i个点的最优值,
利用第i个点决策转移,如下图。
状态转移方程一般可写成:
fi(k) = min{ fi-1 or j( k’) + u(i,j) or u(i,i-1) }

#include <iostream>
using namespace std;
int arr[5000+10];
int inc[5000+10];
int main()
{int n;cin >> n;for (int i = 0; i < n; i++){cin >> arr[i];}// assume n >= 1inc[0] = 1;for (int i = 1; i < n; i++){int max = 0;for (int j = i-1; j >= 0; j--){if (arr[i] > arr[j] && inc[j] > max) max = inc[j];}inc[i] = max + 1;}cout << inc[n-1];return 0;
}

但其实还有个o(nlogn)的方法。因为优化DP有两种方法,一种就是优化状态数,比如棋盘型有时能把四维优化成三维;一种就是优化转移步骤,这里可以把转移步骤的复杂度由n优化成log n。

一种是采用线段树的数据结构,那么从左像右扫,一边扫一边更新区间的最值,然后也查询之前的最值,由于线段树的操作都收log n的,所以最终n*logn

第二种就是采用单调序列的数据结构,其操作如下:

开辟一个栈b,每次取栈顶元素s和读到的元素a做比较,如果a>s,则置为栈顶;如果a<s,则二分查找栈中的比a大的第1个数,并替换。最终栈的大小即为最长递增子序列为长度
考察b栈内每个元素的含义,b[i] 表示所有长度为i的上升子序列中最小的最后一个数.
·举例:原序列为3,4,5,2,4,2
栈为3,4,5,此时读到2,则用2替换3,得到栈中元素为2,4,5,再读4,用4替换5,得到2,4,4,再读2,得到最终栈为2,2,4,最终得到的解是:
长度为1的上升子序列中最小的最后一个数是2 (2)
长度为2的上升子序列中最小的最后一个数是2 (2,2)长度为3的上升子序列中最小的最后一个数是4 (3,4,4)
可知没有长度为4的上升子序列,最长递增子序列长度为3. (3,4,4)

参见:http://www.slyar.com/blog/longest-ordered-subsequence.html

这也是很好理解的,对于x和y,如果x < y且Stack[y] < Stack[x],用Stack[x]替换Stack[y],此时的最长序列长度没有改变但序列Q的''潜力''增大了。

单调序列这里还有一个简单应用,可以练习一下:http://poj.org/problem?id=2823

转载于:https://www.cnblogs.com/lautsie/p/3328456.html

[wikioi]最长严格上升子序列相关推荐

  1. 最长公共上升子序列 LCIS

    关于子序列什么什么的问题,以前一直没怎么在意过,直到省赛突然考了一个赤裸裸的LCIS,这下才着急了,因为忘记怎么做了,而且模版也没有带.从第三名一直掉到第11名,而且超上来的,全都是会做这题的o(╯□ ...

  2. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  3. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)

    题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...

  4. 最长上升子序列(LIS)/最长不上升子序列问题算法详解+例题(树状数组/二分优化,看不懂你来打我)

    目录 最长上升子序列 一.朴素做法O(2n)O(2^n)O(2n) 二.优化做法O(nlogn)O(nlogn)O(nlogn) 三.例题引入:P1020 导弹拦截(求最长上升子序列和最长不上升子序列 ...

  5. hdoj1423 最长上升公共子序列

    hdoj1423 题目分析:  两个数组a[n1] , b[n2], 求最长上升公共子序列.  我们可用一维存储 f[i] 表示 b 数组以 j 结尾, 与 a[] 数组构成的最长公共上升子序列. 对 ...

  6. 动态数组怎么定义_动态规划最长回文子序列

    动态规划|最长回文子序列 今天一起来学习Leetcode第 516 题:最长回文子序列. 题目描述 题目分析 首先回文字符串指的是形如"a","aa",''ab ...

  7. 面试题:求最长非重复子序列

    题目:求字符串的最长非重复子序列.比如字符串"dabaccdeff",它的最长非重复子序列为"dabcef" 这道题目与 面试题35:第一个只出现一次的字符 非 ...

  8. codevs——1576 最长严格上升子序列(序列DP)

     时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解 题目描述 Description 给一个数组a1, a2 ... an,找到最长的上升降子序列ab1< ...

  9. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  10. 5-3 最长连续递增子序列 (20分)

    5-3 最长连续递增子序列 (20分) 给定一个顺序存储的线性表,请设计一个算法查找该线性表中最长的连续递增子序列.例如,(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8 ...

最新文章

  1. 清华大一Python作业太难上热榜!只上3节课,手撸AI算法,网友:离本科毕设只差一篇万字论文...
  2. CentOS6.5_64下 nginx+uwsgi+Python +多站点环境搭建
  3. Jackson 框架,轻易转换JSON
  4. spark on yarn简单部署
  5. 最小栈—leetcode155
  6. POJ-3070 Fibonacci 快速矩阵幂
  7. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
  8. 解决ubuntu系统root用户下Chrome无法启动问题
  9. 嵌入式系统开发工程师入行前十项准备
  10. 前端面试知识点(所谓的面试题)(备份前端网)
  11. python/sklearn 生成分类、回归的数据
  12. zabbix PHP databases support off Fail
  13. TensorFlow使用--MNIST分类学习入门(感知机)
  14. Linux设备管理(三):sysfs文件系统的功能及其应用
  15. node-sass安装失败完美解决方法
  16. python官方中文库_新鲜出炉!Python 3.9 官方中文文档详解!
  17. 华为安装gsm框架_华为gms框架app下载-华为gms框架2020版下载最新版-乐游网安卓下载...
  18. python 读取文件夹下文件,将文件名作为制作标签,训练样本
  19. java mpp转图片,Java使用mpxj导入.mpp格式的Project文件(甘特图)
  20. 在线latex的一些操作

热门文章

  1. linux rootfs制作
  2. 【Vegas原创】红烧肉的做法
  3. 判断一个二叉树是不是对称二叉树
  4. 752. [BJOI2006] 狼抓兔子
  5. 关于Java的反射机制,你需要理解这些..
  6. 开发自己的博客转发插件(跨域)
  7. Android 使用WakeLock
  8. 《30天自制操作系统》学习笔记--第8天
  9. Unable to install breakpoint in XXX due to missing line number attributes的解决
  10. C++自定义函数类型——typedef的使用