【编程之美】2.16 求数组中最长递增子序列
来源:互联网 发布:搭建java开发环境 编辑:程序博客网 时间:2024/05/21 17:29
问题描述:
写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中最长递增子序列的长度。
例如:在序列1,-1,2,-3,4,-5,6,-7中,其最长递增子序列的长度为4(如1,2,4,6)。
问题分析:
该问题满足“无后效性”,可以用动态规划来解决。
设原数组为array[N],假设LIS[i]代表以array[i]为最大元素的最长递增子序列的长度。
那么LIS[i+1] 如何得到?注意到,对于任意的k < i+1,若array[i + 1] > array[k],则LIS[i+1] >= LIS[k] + 1。
事实上,集合{ LIS[K] + 1 | k < i+1且array[k] < array[i+1] } ∪ {1} 中的最大值即为LIS[i+1]。
后面便可以用动态规划的方法求解数组LIS[ ],而LIS[ ]中的最大元素即为数组中最长递增子序列的长度。
代码清单:
int lis(int arr[],int n){int *lis;int i,j,max = 0;lis = (int*)malloc(sizeof(int) * n);for(i = 0;i < n;i++)lis[i] = 1;for(i = 1;i < n;i++)for(j = 0;j < i;j++)if(arr[i] > arr[j] && lis[i] < lis[j] + 1)lis[i] = lis[j] + 1;for (i = 0;i < n;i++) //max(lis)if(max < lis[i])max = lis[i];free(lis);return max;}
int main(){int arr[] = {1,-1,2,-3,4,-5,6,-7};cout<<"length of LIS is "<<lis(arr,sizeof(arr)/sizeof(arr[0]))<<endl;getchar();}
- [编程之美]求数组中最长递增子序列
- 编程之美--求数组中最长递增子序列
- 编程之美--求数组中最长递增子序列
- 读书笔记之编程之美 - 2.16 求数组中最长递增子序列
- 编程之美读书笔记之2.16求数组中最长递增子序列
- 编程之美: 第二章 数字之魅 2.16求数组中最长递增子序列
- 《编程之美》读书笔记17: 2.16 求数组中最长递增子序列
- 编程之美2.16 求数组中最长递增子序列
- 编程之美2.16——求数组中最长递增子序列
- 编程之美2.16求数组中最长递增子序列
- POJ 2533 Longest Ordered Subsequence 编程之美 2.16 求数组中最长递增子序列
- 编程之美 2.16 求数组中最长递增子序列
- 【编程之美】2.16 求数组中最长递增子序列
- 求数组中最长递增子序列(编程之美2.16)
- 编程之美2.16求数组中最长递增子序列Java版
- 编程之美-2.16 求数组中最长递增子序列
- 编程之美 求数组中的最长递增子序列
- 编程之美读书笔记_2.16 求数组中最长递增子序列
- Linux网络编程之套接字选项设置
- android在其他线程中访问UI线程的方法
- 常用的正则表达式
- 当前目录下查找文件 ls -l|grep "se"
- servlet读取post数据
- 【编程之美】2.16 求数组中最长递增子序列
- swing中几种layout示例
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- C# 数据库存储过程的讲解应用
- linux模块虚拟网络接口
- 自定义自己的Dialog
- the features of R.U.B.E
- android/iPhone:如何从browser直接打开应用程序或者打开应用商店(如果没有应用程序)
- list view Item 里面有ImageButton