【面试题之算法部分】LIS最长递增子序列
2015-08-20 23:50
591 查看
动态规划法:
假设数组A中元素为{a0, a1, a2,……, ai, ……., aj,….., an}
设L(j)为以aj结尾的子数组序列的最长递增子序列的长度。
要用动态规划来求解,则必须找到递推关系式,即要找到当前状态L(j)与过去状态L(j-1)、L(j-2)、…..L(0)之间的关系。假设我们已经求出了L(j-1)、L(j-2)、…..L(0),那么如何得到L(j)呢,我们这样来做,要保证递增,则我们从0到j-1遍历一边数组,找到其比a[j]小的元素,最长递增子序列一定从这些中取然后加上一,那么如何保证最长呢,我们设置一个max,在遍历的过程中不断更新max即可。下面给出递推式:
L(j) = max{ L(i) +1,i < j 且 a[i] < a[j] };
有了递推式,代码就容易写出来了。
假设数组A中元素为{a0, a1, a2,……, ai, ……., aj,….., an}
设L(j)为以aj结尾的子数组序列的最长递增子序列的长度。
要用动态规划来求解,则必须找到递推关系式,即要找到当前状态L(j)与过去状态L(j-1)、L(j-2)、…..L(0)之间的关系。假设我们已经求出了L(j-1)、L(j-2)、…..L(0),那么如何得到L(j)呢,我们这样来做,要保证递增,则我们从0到j-1遍历一边数组,找到其比a[j]小的元素,最长递增子序列一定从这些中取然后加上一,那么如何保证最长呢,我们设置一个max,在遍历的过程中不断更新max即可。下面给出递推式:
L(j) = max{ L(i) +1,i < j 且 a[i] < a[j] };
有了递推式,代码就容易写出来了。
int LIS(int A[], int n) { int longest ; for(int i = 0; i < n; i++) longest[i] = 1; for(int j = 1; j < n; j++) for(int i = 0; i < j; i++) if(a[i] < a[j] && (longest[i] + 1 > longest[j])) longest[j] = longest[i] + 1; int max = 1; for(int i = 0; i < n; i++) if(longest[i] > max) max = longest[i]; return max; }
相关文章推荐
- 一个关于if else容易迷惑的问题
- 一道sql面试题附答案
- C# 超高面试题收集整理
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- 人人网javascript面试题 可以提前实现下
- PHP中设置一个严格30分钟过期Session面试题的4种答案
- 据说是雅虎的一份PHP面试题附答案
- php牛逼的面试题分享
- 一套比较完整的javascript面试题(部分答案)
- 小米公司JavaScript面试题
- 超级全面的PHP面试题整理集合第1/2页
- C#使用动态规划解决0-1背包问题实例分析
- 5个实用的shell脚本面试题和答案
- PHP经典面试题集锦
- 8个PHP数组面试题
- PHP中提问频率最高的11个面试题和答案
- 用PHP解决的一个栈的面试题
- 几道坑人的PHP面试题 试试看看你会不会也中招
- 5个JavaScript经典面试题