动态规划-LIS
2015-11-24 16:55
225 查看
最长递增子序列(LIS)的问题是要找到一个给定序列的最长子序列的长度,使得子序列中的所有元素被排序的顺序增加。
例如,{10,22,9,33,21,50,41,60,80} LIS的长度是6和 LIS为{10,22,33,50,60,80}。
最优子结构:
对于长度为N的数组A
= {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],那么L[j] = max(L[i]) + 1, where i < j && a[i] < a[j], 也就是i的范围是0到j – 1。这样,想求aj结尾的最大递增子序列的长度,我们就需要遍历j之前的所有位置i(0到j-1),找出a[i] < a[j],计算这些i中,能产生最大L[i]的i,之后就可以求出L[j]。之后我对每一个A
中的元素都计算以他们各自结尾的最大递增子序列的长度,这些长度的最大值,就是我们要求的问题——数组A的最大递增子序列。
例如,{10,22,9,33,21,50,41,60,80} LIS的长度是6和 LIS为{10,22,33,50,60,80}。
最优子结构:
对于长度为N的数组A
= {a0, a1, a2, …, an-1},假设假设我们想求以aj结尾的最大递增子序列长度,设为L[j],那么L[j] = max(L[i]) + 1, where i < j && a[i] < a[j], 也就是i的范围是0到j – 1。这样,想求aj结尾的最大递增子序列的长度,我们就需要遍历j之前的所有位置i(0到j-1),找出a[i] < a[j],计算这些i中,能产生最大L[i]的i,之后就可以求出L[j]。之后我对每一个A
中的元素都计算以他们各自结尾的最大递增子序列的长度,这些长度的最大值,就是我们要求的问题——数组A的最大递增子序列。
int LIS(int a[],int length) { int distance[length]; for(int i=0;i<length;i++) { distance[i] = 1; for(int j=0;j<i;j++) { if(a[j]<a[i] && (distance[j]+1) > distance[i]) distance[i] = distance[j]+1; } } int longestDistance = distance[0]; for(int i=1;i<length;i++){ if(distance[i] > longestDistance) longestDistance = distance[i]; } return 0; }
相关文章推荐
- padding和margin两个重要属性的介绍及举例
- Oracle logminer使用方法总结
- 基于RecyclerView-添加上啦加载(AndroidStudio)
- 学习在requirejs下如何使用underscore.js模板
- 本地工程提交github
- WINDBG常用方法
- Windows下 python快速安装numpy、matplotlib、scikit-learn等库方法总结
- Mapeduce编程八大步骤
- 话说java单例模式的饿汉式,懒汉式
- JNDI查找方式
- atoi 等相关函数的用法
- Vim As IDE
- 用photoshop如何制作背景透明的图片
- 【LEETCODE】206-Reverse Linked List
- Django笔记教程:三、Model进阶
- Oracle 11g R2+RAC+ASM+OracleLinux6.4安装详解(图)
- servlet中web.xml配置详解
- [工具类] 字符串
- 破解windows server 2008 的登录密码。有效的
- zabbix中文乱码的解决办法