博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长递减子序列--动态规划
阅读量:4141 次
发布时间:2019-05-25

本文共 1183 字,大约阅读时间需要 3 分钟。

例如:有一个序列,例如 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 
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
a[j] && max
max)61 {
63 max=d[i]; 65 max_index=i; 67 } 69 }70 71 //从最大子序列的下标开始 输出子序列 72 cout<<"\n最长递减子序列的长度为:"<
<<",最长子序列为:"<

转载地址:http://vkrvi.baihongyu.com/

你可能感兴趣的文章
C++与C的一个小区别(变量定义的先后区别)
查看>>
H.264码流分析入门(以第一帧为例)
查看>>
JM8.6中的一个重要结构体NALU_t的定义、分配和释放
查看>>
尽信书则不如无书、尽信标准则不如无标准(也谈JM8.6代码中的手误)
查看>>
H.264中NALU、RBSP、SODB的关系 (弄清码流结构)
查看>>
简单看一看H.264中的SPS和PPS
查看>>
闲谈杂扯:什么是H.264标准?什么是H.264句法元素?
查看>>
JM8.6中NALU(此处指非VCL式的NALU,如SPS和PPS)是如何写进码流的?
查看>>
从JM8.6代码看Bitstream、DataPartition、Slice、Picture的关系及码流结构本质
查看>>
JM8.6中NALU(此处指VCL式的NALU)是如何写进码流的?
查看>>
C语言中%*[^\n]的重要用途(从JM8.6解码器中学到的)
查看>>
JM8.6编码器主要函数调用关系小结
查看>>
JM8.6编解码器中trace_enc.txt和trace_dec.txt文件的功能
查看>>
JM8.6解码端是如何从配置文件decoder.cfg获取数据的? (init_conf函数)
查看>>
单曲循环之张震岳《再见》
查看>>
JM8.6解码端是如何对H.264码流进行读取的?(GetAnnexbNALU 函数)
查看>>
JM8.6解码端是如何把像素值写进test_dec.yuv文件的?(write_out_picture函数)
查看>>
C/C++中的“头文件卫士”
查看>>
为什么C语言的同一个文件中可以定义两个接口完全相同的函数?
查看>>
如何用matlab批量新建和删除文件夹?
查看>>