算法导论15
2016-02-08 20:16
176 查看
原题:
设计一个O(n^2)时间的算法,求一个n个数的序列的最长单调递增子序列
想法:
记录每个位置元素一定被包含在其中的子序列的最大长度
靠后的元素加入的子序列依赖之前的子序列
两个for循环,O(n^2)显然
其姊妹题15.4-6见
http://blog.csdn.net/wdq347/article/details/8978394
其思考题15-2
算法:
对a[ i ]到a[ j ]的最大回文子序列,其最大回文序列可由a[ i + 1 ]到a[ j - 1 ]推出(如果存在)
全部算一遍也就C(2, n),i = j 的情况直接等于1
然后还觉得可以利用之前的LCS(longest common sequence)的算法
对序列a及他的逆序列做LCS,得到的感觉是回文序列,但是并没有想到什么证明
如果错了或者有人有证明欢迎留言
设计一个O(n^2)时间的算法,求一个n个数的序列的最长单调递增子序列
想法:
记录每个位置元素一定被包含在其中的子序列的最大长度
靠后的元素加入的子序列依赖之前的子序列
两个for循环,O(n^2)显然
#include<iostream> using namespace std; struct lAndMax { int length, max; }; int main() { int * v; int len; cout << "enter the numbers of integer: "; cin >> len; v = new int[ len ]; for (int i = 0; i < len; i++) { cin >> v[ i ]; } //记录包含自己本身在内的递增序列的最大长度 lAndMax * maxTemp = new lAndMax[ len ]; int max = 0; for (int i = 0; i < len; i++) { maxTemp[ i ].length = 1; maxTemp[ i ].max = v[ i ]; for (int k = i - 1; k >= 0; k--) { if (v[ i ] > maxTemp[ k ].max) { if (maxTemp[ i ].length <= maxTemp[ k ].length) { maxTemp[ i ].length = maxTemp[ k ].length + 1; } } } if (max < maxTemp[ i ].length) max = maxTemp[ i ].length; cout << i << " length:" << maxTemp[ i ].length << " max:" << maxTemp[ i ].max << endl; } cout << maxTemp[ len - 1 ].length << endl; delete[] v; delete[] maxTemp; }
其姊妹题15.4-6见
http://blog.csdn.net/wdq347/article/details/8978394
其思考题15-2
算法:
对a[ i ]到a[ j ]的最大回文子序列,其最大回文序列可由a[ i + 1 ]到a[ j - 1 ]推出(如果存在)
全部算一遍也就C(2, n),i = j 的情况直接等于1
然后还觉得可以利用之前的LCS(longest common sequence)的算法
对序列a及他的逆序列做LCS,得到的感觉是回文序列,但是并没有想到什么证明
如果错了或者有人有证明欢迎留言
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析