之前做递增子序列编程题的时候就考虑过用递归,今天上午写了一下,感觉用递归并没有什么意义,从最后找到边界,再从边界往后一次一次的和前一个比较,比前一个大就让当前递增子序列+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 }