递归求最长连续递增子序列

之前做递增子序列编程题的时候就考虑过用递归,今天上午写了一下,感觉用递归并没有什么意义,从最后找到边界,再从边界往后一次一次的和前一个比较,比前一个大就让当前递增子序列+1,不大就给开始和结束位置重新赋值,并时时更新最长子序列。思路和正常写完全一样,无非就是递归找到了边界。(因为比较习惯用下标,所以就没用地址)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 #define maxsize 10000
 5 
 6 typedef int Status;
 7 
 8 typedef struct
 9 {
10     int start;
11     int end;
12 }SubSeq;//记录子序列开始位置,结束位置
13 
14 void PrintSub(SubSeq Max,int a[])
15 {
16     for(int i=Max.start;i<Max.end;++i)
17     printf("%d ",a[i-1]);
18     printf("%d",a[Max.end-1]);
19 }
20 
21 Status GetSub(int a[],SubSeq &Cur,SubSeq &Max,int n);
22 
23 int main()
24 {
25     int n;
26     scanf("%d",&n);
27     int a[maxsize];
28     for(int i=0;i<n;++i)
29     scanf("%d",&a[i]);
30 
31     SubSeq Cur;//当前递增子序列
32     SubSeq Max;//最长递增子序列
33 
34     GetSub(a,Cur,Max,n);
35 
36     PrintSub(Max,a);
37 
38     return 0;
39 
40 
41 }
42 
43 Status GetSub(int a[],SubSeq &Cur,SubSeq &Max,int n)
44 {
45     if(n==0) return 0;
46 
47     if(n==1)//边界
48     {
49         Cur.start=1;
50         Cur.end=1;
51         Max.start=1;
52         Max.end=1;
53     }
54     else
55     {
56         GetSub(a,Cur,Max,n-1);
57 
58         if(a[n-1]>a[n-2])
59         Cur.end++;
60         else
61         {
62             Cur.start=n;
63             Cur.end=n;//容易乱
64         }
65 
66         if(Cur.end-Cur.start>Max.end-Max.start)
67         {
68             Max.start=Cur.start;
69             Max.end=Cur.end;
70         }
71 
72     }
73 
74     return 1;
75 }

猜你喜欢

转载自www.cnblogs.com/Cuitiaotiao/p/11531090.html