動態規划之最長單調遞增子序列


東 華 大 學

《算法設計分析與綜合實踐》分析題作業

 

學生姓名:曹晨 學號:171310402

請勿抄襲或轉載

  1. 作業題目

    設計一個O(n² )時間的算法,找出由n個數組成的序列的最長單調遞增子序列。

  2. 解題過程(針對算法設計題)
  3. 解題思路/算法設計思路。

    記f(x)為ax結尾的最長遞增子序列的長度,那么答案就是max{f(x)}。

    考慮比x小的每一個數k(0<=k<x):我們把ax接在ak的后面,肯定能構造一個以ax結尾的上升子序列,長度比ak以結尾的上升子序列大1,

    所以如果有ax>ak,那么f(x)可以取f(k)+1。

  4. 寫出算法描述(

    算法描述如下:

    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

    輸出:

  5. 算法分析:

時間復雜度:

代碼中用到了一個兩個for循環的嵌套(第12行-第21行),所以時間復雜度為O(n² )。

空間復雜度:

代碼中申請了兩個n長度的數組,分別用來存放元素和在以第i個元素為結尾時最長遞增子序列的值,所以空間復雜度為O(n)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM