最长递减子序列--动态规划
来源:互联网 发布:逻辑思维导图软件 编辑:程序博客网 时间:2024/05/16 12:39
例如:有一个序列,例如 9 8 2 1 7 5 3 4 3 2 1.
求出最长的递减子序列。如本例的结果就是:9 8 7 5 4 3 2 1。
分析:
可采用动态规划的思想进行解答,时间复杂度为O(n^2).
设原数组为a[1....n]。另设一数组d[1....n],其中d[i]表示从第i个元素开始(一定包含第i个元素),到整个数组末尾的子序列 a[i...n]中的最长递减子序列的长度。
则本问题就是要在求出d[1]的同时,恢复出最优解。
下面给出递推式:
d[i]的值分两种情况:
1、当i=n时,d[i]=1。即最后一个元素的序列的最大递减子序列中只有它自己。
2、当i<n时,d[i]=max{d[k]| i<k<=n 且a[i]>a[k]} +1。解释意思为,包含第i个元素的序列a[i...n]的最大子序列依赖于i后面所有的序列中比a[i]小(满足递减
特性),且最大的d[k](满足最 优特性)值再加1(加上a[i]元素)。在给d[i]赋值的时候只需记录p[i]=k,既可以作为parent属性恢复出解。
具体实现的话,开两个数组d[n],p[n],外层循环从后往前选取i,内层循环从i往后寻找最优的k,双循环遍历即可求出所有的d[i]。然后 再进行一次O(n)操作,找出最大的d[max]。恢复解的话,可以从p[max]开始,依次恢复出各个解。
1 #include <iostream.h> 3 void longest_decrease_sub(int *a, int size) 4 { 6 int *d=new int[size]; //分配内存空间 7 int *p=new int[size]; //分配内存空间 9 d[size-1]=1; 11 for(int i=size-1;i>=0;i--)12 { 14 int max=0; 16 int index=0; 18 for(int j=i;j<size;j++)19 { 21 if(a[i]>a[j] && max <d[j])22 { 24 max=d[j]; 26 index=j; 28 } 30 } 32 if(max==0)33 { 35 d[i]=1; 37 p[i]=-1; 39 }40 else41 { 43 d[i]=max+1; 45 p[i]=index; 47 } 49 }50 51 //寻找最大子序列的起始下标 53 int max=0; 55 int max_index=0; 57 for( i=0;i<size;i++)58 { 60 if(d[i]>max)61 { 63 max=d[i]; 65 max_index=i; 67 } 69 }70 71 //从最大子序列的下标开始 输出子序列 72 cout<<"\n最长递减子序列的长度为:"<<d[max_index]<<",最长子序列为:"<<ends; 74 for( i=max_index;i!=-1;i=p[i])75 { 77 cout<<a[i]<<" "<<ends; 79 }80 81 delete [] d; 83 delete [] p; 85 }86 87 void main()88 {89 int data[10]={1,2,5,4,3,2,7,8,9,0};90 longest_decrease_sub(data,10);91 }
- 最长递减子序列--动态规划
- 最长递减子序列 动态规划
- 动态规划--寻找最长递减子序列
- 动态规划——数组中最长递减子序列
- 动态规划——数组中最长递减子序列
- 动态规划——数组中最长递减子序列
- 动态规划——数组中最长递减子序列
- 最长递减子序列
- 最长递减子序列
- 最长递减子序列
- 最长递减子序列
- 最长递减子序列
- POJ-1887-Testing the CATCHER-最长递减子序列-DP动态规划
- POJ 1952 BUY LOW,BUY LOWER 最长递减子序列 动态规划
- HDU1069 Monkey and Banana(dp动态规划,最长非递减子序列变形题)
- HDU1069 Monkey and Banana(动态规划,单调最长递减子序列)
- 挑战练习题2.3动态规划 poj1065 Wooden Sticks 最长递减子序列
- 最长非递减子序列LIS(动态规划法,一维)
- 关于protected成员
- Android中处理崩溃异常
- 《C++ Primer》读书笔记(3.8,3.9,3.10)
- POI读取文本格式字段仍为数字问题
- iOS开发-用keychain替代UDID
- 最长递减子序列--动态规划
- android中左右滑屏的实现(广告位banner组件)
- 退出Activity的方法
- X86如何解决Android应用兼容性问题?
- 最佳编程语录
- Centos安装CouchDB
- UMl类的关系图的解释
- 个人分享JAVA与C++优点缺点对比
- Log Miner 使用