演算法第三章作業

2022-07-09 23:33:14 字數 1158 閱讀 7182

1.單調遞增最長子序列

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

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

輸入有兩行:

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

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

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

51 3 5 2 9

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

4**:

#include

using namespace std;

int b[20];

int ans = 1;

void solve(int a, int n)

}int main()

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

設定了乙個b[i]陣列,從第乙個數開始比較,直至最後乙個數。

遞迴方程式:b[i]=max+1

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

表的維度:一維,因為陣列是一維陣列

填表範圍:0<=j填表順序:自左而右

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

時間複雜度:因題目有要求而且**中有雙重迴圈比較,所以為o(n*n)

空間複雜度:o(n),用到了乙個一維陣列來存放資料

2.對動態規劃演算法的理解

動態規劃演算法的基本思想是將待求解問題分成若干個子問題,通過求解子問題,來得到原問題的解;適用於動態規劃演算法求解的問題經過分解後得到的問題往往不是互相獨立的。

動態規劃演算法的第一步通常是要刻畫最優解的結構,接著利用最優子結構性質來遞迴地從子問題的最優解逐步構造出整個問題的最優解,然後以自底向上的方式計算最優值,最後根據計算最優值時得到的資訊,構造最優解。動態規劃演算法需要考慮的是子問題的重疊性質,解決方式即每個子問題都只求解一次並儲存在**中,等要用的時候直接訪問**,得到所要的子問題的解。

3.結對程式設計情況

這一次結對程式設計的題目是最低通行費,因為一開始在做題的時候我對動態規劃演算法還是比較陌生的,而且還沒掌握好方法,但是和夥伴在分析題目,結合老師所講的**之後,我們很快就把遞迴方程式寫出來了,然後就可以按照遞迴方程式打**了。在這個過程中給我的感受是討論的力量是很大的,而且討論可以讓我在還不太熟悉知識點的情況下,慢慢地讓知識點進腦子裡,所以我覺得結對程式設計可以提高學習效率,同時學習他人不同的思考方式來拓寬自己的思維。

演算法第三章作業

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

演算法第三章作業

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

演算法第三章作業

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