演算法第三章作業

2022-07-12 04:48:08 字數 996 閱讀 1987

以「單調遞增最長子序列」為例

題目3-2 單調遞增最長子序列 (25分)

設計乙個o(n2)時間的演算法,找出由n個數組成的序列的最長單調遞增子串行。

輸入有兩行: 第一行:n,代表要輸入的數列的個數 第二行:n個數,數字之間用空格格開

最長單調遞增子串行的長度

在這裡給出一組輸入。例如:

5

1 3 5 2 9

在這裡給出相應的輸出。例如:

4

**

#includeusing namespace std;

int n;

int array[1000];//用於儲存輸入的序列

int m[1000];//m【i】表示以第i個元素為結尾的最長單調遞增序列的長度

int length;//最長單調遞增序列的長度

int findlongest()

cout<

1.1根據最優子結構性質,列出遞迴方程式

m[i]表示以第i個元素為結尾的最長單調遞增序列的長度

m[i]=max(m[i],m[j]+1)

1.2 給出填表法中表的維度、填表範圍和填表順序。

填的表是一維陣列,用的二重迴圈,從上到下(1到n),從左到右(1到 i)

1.3 分析該演算法的時間和空間複雜度

根據題目要求,時間複雜度為o(n2)

空間複雜度為n,用到了一維陣列儲存

動態規劃將原問題分解為多個子問題,具有最優子結構性質和重疊子問題,通過填表法,避免了子問題重複求解的問題,提高了演算法的效率。

需要對問題進行分析,確定出遞迴方程式,然後確定填表順序,維度,範圍等,分析清楚後,**就更加容易寫出來了。

上週上機課,答的題目是最低通行費問題,我開始沒有什麼思路,然後是搭檔先想到了解題思路,打出的**也執行通過了,然後她耐心給我講解,原本不太懂動態規劃的我聽了之後好像一下子就明白了。

演算法第三章作業

1.動態規劃是一種能夠減少重複運算的一種演算法,比較適合原問題能依賴於子問題解得,而子問題也能夠依賴於子子問題解得而出的問題。其次,動態規劃更適合於資料量較多的時候的一種演算法,當資料量沒有到達一定規模的時候,動態規劃演算法不能夠體現出足夠的優勢。如對於揹包問題的貪心演算法和動態規劃法 2.1 單調...

演算法第三章作業

我覺得動態規劃是一種分治法的偽高階型,它將乙個大問題可以分成若干個小問題後,解決子問題,然後將子問題的解插入到乙個表中,用乙個表來記錄所有的已經得到答案的子問題的解,後面就可以發現,無論子問題的解是否被用到,其都在表中,接著求問題便可以節省大量的時間。3 1m i 1 n 1 m i max 1 1...

演算法第三章作業

組員 高珞洋,何汶珊 之前在學習分治法的時候也有將其和動態規劃進行比較,動態規劃能夠解題的根本要求是原問題可以細分成子問題,且原問題的最優解必包含子問題的最優解。為了更明確上述條件,從而保證題目能夠運用動態規劃求解,通常需要兩步操作 明確問題具有最優子結構,並分解問題 找出遞推關係式 狀態轉移方程 ...