回溯法——最长上升自序列问题(附源码)
来源:互联网 发布:java中的泛型集合 编辑:程序博客网 时间:2024/06/05 05:15
当说到求最长上升自序列问题时,一般人都会想到用动态规划来求解
笔者当时遇到这个问题时,并没有学习动态规划,所以想出了另一种解决方案
下面笔者将介绍一种用回溯法求解最长上升序列问题
先看程序效果:
例一:以序列 2,1,3,5,9,4,8 为例,可以看出其最长上升自序列为:
1 3 4 8
1 3 5 8
1 3 5 9
2 3 4 8
2 3 5 8
2 3 5 9
下面开始讲解此算法:
由于此方法要用到后续数,首先给出一个后续数的定义
后续数:以当前元素开始的子序列的最长上升子序列元素的个数减一
求一个数的后续数的方法:从这个元素开始向后查找元素值比它大并且后续数最大的元素的后续数加一,如果它后面没有比它小的元素,则其后续数为零
定义读起来有点拗口,下面笔者举例来说明
还是一序列 2 ,1,7,3,5,9,4,8为例:
8的后续数为0,因为8后面没有比它大的元素
4的后续数为1,因为8比4大,4的后续数就是8的后续数加1;
9的后续数为0,因为9后面没有比它大的元素;
3的后续数为2,因为3 的后续数可以是4的后续数(后续数为1)加1或者是5的后续数(后续数为1)加1。即是2
1的后续数为3,因为1元素后面后续数最大的元素是2,则1的后续数就是2的后续数(后续数为2)加1,即是3
可以依次求得每个元素的后续数:
元素 后续数
8 0
4 1 (0+1)
9 0
5 1 (0+1)
3 2 (1+1)
7 1 (0+1)
1 3 (2+1)
2 3 (2+1)
如下图所示,连线右边的元素大于左边的元素,并且其后续数等于左边元素的后续数减1
因此,即求得了所有的最长上升自序列
相关代码如下:
#include"stdio.h"#define M 50 //宏定义元素个数有50个#define N 50struct node{int num; //存放元素int last; //存放元素的后续数}a[M],b[M];int OutCont=0; int count=0; //存储用户输入的元素个数int houXu=0; //存储最长后续数void huidai(struct node a[],int q) //把組成最長上升序列的元素以树的形式連接起來{for(int i=q+1;i<=count;i++){ if(a[i].num>a[q].num && a[i].last+1==a[q].last){b[OutCont]=a[i];if(0==a[i].last){for (int j=0; j<OutCont+1;j++){printf("%d",b[j].num);}printf("\n");}else{++OutCont;huidai(a,i);--OutCont;}}}}int main(){int t,q;printf("请输入序列中元素的个数:");scanf("%d",&count);getchar();printf("请输入序列元素,用空格隔开:");for(int i=1;i<=count;i++) //用数组a[]来存放数,从a[1]开始存放{scanf("%d",&a[i].num);} for(i=0;i<=count;i++) //后续数清零 a[i].last=0;for(int j=count-1;j>0;j--) //将每个元素的后续数求出{t=0;for(int i=j+1;i<=count;i++) { if(a[i].num>a[j].num&&a[i].last>=a[0].last) { a[0].num=a[j].num; a[0].last=a[i].last; t=1; }}if(t==1)a[j].last=a[0].last+1;}a[0].last=0;for(i=0;i<=count;i++) //求出最长后续数,将其存放到houXu中 if(a[i].last>=houXu) { houXu=a[i].last;q=i; }printf("\n最长上升序列的长度为:%d\n",houXu+1);//將最长上升序列的个数输出printf("上升序列为:\n");for (i=1;i<=count;i++){if(a[i].last==houXu){b[OutCont]=a[i];++OutCont;huidai(a,i);--OutCont;}} getchar(); return 0;}
欢迎大家转载,如有转载请注明文章来自: http://blog.csdn.net/q345852047
- 回溯法——最长上升自序列问题(附源码)
- 最长上升自序列
- 动态规划之最长上升自序列问题
- UVA - 10599 Robots(II)(最长上升自序列)
- 最长上升自序列的另一种解法。
- hdu1069!求最长上升自序列的和
- bzoj3173 最长上升自序列 块状链表
- 最长上升子序列——回溯法
- 最长递增自序列
- hdu 4512 吉哥系列故事——完美队形I(最长公共上升自序加强版)
- 最长递增自序列 python
- 动态规划例题 最大上升自序列
- 求解数组中最长递增自序列
- 3字符串求最长公共自序列
- 错误的求最长递增自序列算法——写完了才发现,有待于细心的你琢磨
- 最长上升子列~
- 最长上升子列
- hdu 5087 次长上升自序列的长度dp
- gallery3d 代码分析之 glsurfaceview
- CentOS 5.5 使用VNC进行远程配置
- 你还在用if else吗?(转载)
- 知识积累2:Mysql对表的修改,复制与删除
- 存储过程返回多个结果集直接在MSSQL里合并
- 回溯法——最长上升自序列问题(附源码)
- 把搜索引擎搬回家---利用自己开发的vc组...
- 解析错误“[RPC Fault faultString="" faultCode="400" faultDetail="'sr' parameter is invalid"]”
- php批量移除UTF-8代码中的BOM
- 找工作的原则
- accumulate的用法
- xcode 4.2 新建工程模板详解
- ArcGIS常见问题解决之Server Object instance creation failed on machine xxx
- android 之 Broadcast(广播) BroadcastReceiver(广播接收者)