東 華 大 學
《算法設計分析與綜合實踐》分析題作業
學生姓名:曹晨 學號:171310402
請勿抄襲或轉載
-
作業題目
設計一個O(n² )時間的算法,找出由n個數組成的序列的最長單調遞增子序列。
- 解題過程(針對算法設計題)
-
解題思路/算法設計思路。
記f(x)為ax結尾的最長遞增子序列的長度,那么答案就是max{f(x)}。
考慮比x小的每一個數k(0<=k<x):我們把ax接在ak的后面,肯定能構造一個以ax結尾的上升子序列,長度比ak以結尾的上升子序列大1,
所以如果有ax>ak,那么f(x)可以取f(k)+1。
-
寫出算法描述(
算法描述如下:
1 #include <iostream>
2
3 using namespace std;
4
5 int LSI(int *a,int n)//計算最長遞增子序列的值的函數
6 {
7 int f[n];
8 for(int i=0;i<n;i++)
9 {
10 f[i]=1;
11 }//以a[i]結尾的最長單調子序列初始化為1,即它本身
12 for(int i=1;i<n;i++)
13 {
14 for(int j=0;j<i;j++)
15 {
16 if(a[j]<a[i])
17 {
18 f[i]=max(f[i],f[j]+1);
19 }//如果i前面j的值小於i的值,那么i的最長遞增子序列可以取k的最長遞增子序列的數值加1
20 }
21 }
22 int length=0;
23 for(int i=0;i<n;i++)
24 {
25 length=max(length,f[i]);
26 }//找到所有單調遞增子序列中的最大值
27 return length;//返回最長單調遞增子序列
28 }
29 int main()
30 {
31 int n;
32 cin>>n;//元素的個數
33 int a[n];
34 for(int i=0;i<n;i++)
35 {
36 cin>>a[i];
37 }//存放元素
38 cout<<LSI(a,n);//調用求最長遞增子序列的函數,並輸出該值
39 return 0;
40 }
輸入:8
1 5 3 4 6 9 7 8
輸出:
- 算法分析:
時間復雜度:
代碼中用到了一個兩個for循環的嵌套(第12行-第21行),所以時間復雜度為O(n² )。
空間復雜度:
代碼中申請了兩個n長度的數組,分別用來存放元素和在以第i個元素為結尾時最長遞增子序列的值,所以空間復雜度為O(n)。