您的位置:首页 > 其它

算法导论15

2016-02-08 20:16 176 查看
原题:
设计一个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,得到的感觉是回文序列,但是并没有想到什么证明

如果错了或者有人有证明欢迎留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论 算法