`
happmaoo
  • 浏览: 4324876 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

算法设计作业LIS(最长递增子序列)

阅读更多

/*
功能说明: 给定一个非负整数数组,找出最长递增子序列.
作者:hfjiang
完成日期: 2005-3-13
*/
#include<iostream>
using namespace std;
#define GT 1000
#define LT -1000
#define EQ 5000
int max(const int i,const int j,const int T[6][6],const int size);
int main()
{
//int a[6] = {0,5,4,2,1,3};
int a[6] = {0,1,2,3,4,5};

//没考虑数组中有相同元素的情况,其实也超简单

//更多数的,把6换一下就行.
//int size = sizeof(a) / 4;
int size = 6;
int T[6][6];
for(int i = 0;i < size;i++){
for(int j = 0 ; j < size;j++){
T[i][j] = 0;
}
}

//build relation table
for( i = 0;i < size;i++){
for(int j = i+1 ; j < size;j++){
if(a[i] > a[j]) T[i][j] = GT;
if(a[i] == a[j]) T[i][j] = EQ;
if(a[i] < a[j]) T[i][j] = LT;
}
}
for( i = 0;i < size;i++){
cout<<endl;
for(int j = 0;j < size;j++){
cout << T[i][j] <<"\t";
}
}
cout << endl;
cout << endl;

//dynamic programing
for( i = 0;i < size;i++)
T[i][i] = 1;
for( i = 0;i < size;i++){
for(int j = i+1 ; j < size;j++){
if(T[i][j] == GT)
T[i][j] = 0;
}
}

for(i = size-2 ;i >= 0;i--){
for(int j = i+1 ;j < size ;j++){
if(T[i][j] == LT){
//T[i][j] = max{A[j][K]|k=j...size-1};
T[i][j] = max(j,j,T,size) + 1;
}
}

}
for( i = 0;i < size;i++){
cout<<endl;
for(int j = 0;j < size;j++){
cout << T[i][j] <<"\t";
}
}

return 0;

}
int max(const int i,const int j,const int T[6][6],const int size){
/*
Return the max value of T[i][j....size-1];
*/
int max = T[i][j];
for(int k = j+1;k < size;k++){
max = max < T[i][k] ? T[i][k] : max;
}
return max;
}

cost: 0(n^3)

程序设计思想:

D.P

1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1.

2. 回溯:从上三角矩阵从下往上找最大值。

3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。

4. 最终可能有多条路径:因为可能存在多个LIS。

D.P

1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1.

2. 回溯:从上三角矩阵从下往上找最大值。

3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。

4. 最终可能有多条路径:因为可能存在多个LIS。

D.P

1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1.

2. 回溯:从上三角矩阵从下往上找最大值。

3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。

4. 最终可能有多条路径:因为可能存在多个LIS。

D.P

1。首先建立关系表:大小偏序关系。只有小于关系能走(上三角矩阵) . 对角线初始化为1.

2. 回溯:从上三角矩阵从下往上找最大值。

3. 上面程序并未给出子序列:只需在最终矩阵中找每行最大对应的元素,即为LIS中元素。

4. 最终可能有多条路径:因为可能存在多个LIS。

Plz enjoy!

分享到:
评论

相关推荐

    中科大算法导论课程实验 最长递增子序列 代码

    中科大软件学院 算法导论课程实验 正式题目二 最长递增子序列 Visual Studio 2012 项目包 使用4种不同的方法实现最长递增子序列

    中科大算法导论课程实验 最长递增子序列 报告

    中科大软件学院 算法导论课程实验 正式题目二 最长递增子序列 实验报告 使用4种不同的方式实现最长递增子序列

    LIS最长单调递增子序列

    使用动态规划思想求出最长单调递增子序列(LIS),时间复杂度为O(n log k)

    LIS:最长递增子序列作业,图形界面

    ##算法最长递增子序列时间复杂度O(nlogn)##接口JAVA swing ##功能更改输入字符串的长度随机生成输入字符串标记输入字符串中最长的递增子序列

    最长单调递增子序列LIS

    我写的LIS算法,有两种思路,程序全在这个cpp文件中,可以运行

    Rust中最长递增子序列算法_rust_代码_下载

    还提供了一个用于区分列表的功能,该功能利用了 LIS 算法。

    dowalle#algo#300-[LIS]-最长递增子序列1

    1. 定义状态: 2. 状态转移方程: 3. 初始化: 4. 输出: 5. 空间优化: 1 .定义新状态: 2. 状态转移方程: 3. 初始化: 4. 输出:

    算法设计与分析实验报告

    校门外的树、字符串子序列、6种排序算法分析、最长递增子序列,算法分析

    论文研究-生物信息挖掘中LIS算法研究.pdf

    探讨了生物信息挖掘中ó模式子序列问题的一个特例,即最长递增子序列(LIS)问题。对于LIS问题,分别用LCS算法、动态规划、动态规划结合二分法进行求解,并分析了这三种算法的时间和空间复杂度,对其中两种算法进行了...

    c语言最长上升子集.rar

    最长上升子序列问题可以这样定义:给定一个无序的整数数组,任务是找到该数组中一个最长的子序列,使得这个子序列中的元素从左到右是严格递增的。这里的“子序列”是指从原数组中挑选出的一些元素,它们保持原序列中...

    javalruleetcode-magician:java学习

    最长递增子序列 MaxLength: 无环有向图最长加权路径 LPS: 最长回文子序列 Knapspack: 01背包问题 ####贪心算法 ActiveSelect: 活动选择问题 IGCP: 区间染色问题 ####图算法 ListGraph: 邻接链表表示法 Transpose: ...

    algorithoms:进阶算法

    数组中最长的递增子序列在最长增加子序列(LIS)问题中,找到给定序列的最长子序列的长度,以使该子序列的所有元素都按升序排序 Ex: Input : arr[] = {3, 10, 2, 1, 20,4,56,78,90} Output : Length of LIS = 6 ...

    leetcode表现最好的时间段-DP-Interviews:DP-面试

    最长递增子序列 使序列排序的最小删除次数 经典的 LIS 问题。 找到序列的 LIS 和deletions = arr.length - LIS.length (非常类似于双调序列) 选择最后一个操作的所有可能间隔中的所有可能削减 在这里解释—— ...

    leetcode刷题app-blog:问题博客

    leetcode刷题app 面试 Google 招聘的网上算法试场,一般一场打进前40可能会收到Google的面试邀约 ...最长递增子序列 - LIS(Longest Increasing Subsequence) 2.3 01背包 - 01 Knapsack 3. 数据结构 3.1 二叉搜索树

Global site tag (gtag.js) - Google Analytics