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 >= 1
inc[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

最新文章

  1. C++之路进阶——poj3461(Oulipo)
  2. java 静态代理-积木系列
  3. 阿里云Centos配置iptables防火墙
  4. android presentation
  5. Incompatible operand types DeptE and int 异常处理
  6. (转)log4net的配置详解
  7. 012--VS2013 C++ 斜角景物地图贴图-位图
  8. TM1668 Led 驱动芯片源程序
  9. Extjs4 关于设置form中所有子控件为readOnly属性的解决方案
  10. ubuntu 硬件系统信息
  11. 【OpenMesh】创建一个正方体
  12. 在centos6,7 上编译安装内核
  13. (11.20)Java小知识!
  14. JavaScript是如何工作的: CSS 和 JS 动画底层原理及如何优化它们的性能
  15. Django 数据迁移
  16. 浅谈跨平台框架 Flutter 的优势与结构
  17. python开发环境搭建(python2.7.5+pyCharm2.7.3)【原创】
  18. 【Android】3.17 示例17--周边雷达功能
  19. 转载:QTableView中嵌入可视化组件
  20. mininet+floodlight使用(一)

热门文章

  1. Scala闭包
  2. struts2拦截器的实现原理
  3. 一个不错的flash 模板
  4. Java联网技术之一HTTP
  5. 使用XMl序列化器生成xml文件
  6. java log日志的输出。
  7. 学习笔记_Filter小结(过滤器JavaWeb三大组件之一)
  8. ios6-7以后用户开热点后的屏幕适配
  9. Flask,HelloWorld
  10. AMAZON PRICE TRACKER, AMAZON PRICE HISTORY, AMAZON PRICE DROP ALERT | DROPGG.COM