動態規劃之最長上公升子串行

2021-10-06 03:26:38 字數 1456 閱讀 3961

動態規劃指的是將乙個繁雜的問題分解成子問題之後,通過求解子問題的最優解,從而求得整體最優解。

輸入資料:

輸入的第一行是序列的長度n(1<=n<=1000),第一行給出序列的n個整數,這些整數的取值範圍在0-10000.

輸出要求:

最長上公升子串行的長度。

輸入樣例:

7

1 7 3 5 9 4 8

輸出樣例:

範例**:

#include

#include

using

namespace std;

intmain()

for(

int i =

1; i < n; i++)}

} cout <<

*max_element

(maxlen +

1, maxlen + n +1)

;}

講解:

1.

int n;

cin >> n;

int maxlen[

100]

;int s[

100]

;for

(int i =

0; i < n; i++

)

這一部分是輸入資料,並且讓儲存以當前下標為終點的子串行的個數的maxlen陣列都初始化為1.

for

(int i =

1; i < n; i++)}

}

這一部分是正式求解 以當前下標為終點的最長上公升子串行 的長度,並且分別儲存在maxlen陣列內。

i每往後迴圈一次,j就要將i之前的資料都迴圈一遍。

當s[i]>s[j]時就要求maxlen[j]+1與maxlen[i]之間的最大值進行maxlen[i]的更新。

:之所以需要每次都求maxlen[i]和maxlen[j]+1的最大值,而不直接將maxlen[j]+1賦值給maxlen[i],是因為maxlen[i]之前的更新可能已經使maxlen[i]>maxlen[[j]+1,故 此時maxlen[i]應保持不變。

最後一部分為輸出部分,呼叫max_element函式輸出manlen陣列內的最大值。

:max_element函式返回值是乙個指標

max_element和max函式需要呼叫標頭檔案algorithm

動態規劃 之 最長上公升子串行

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...

動態規劃之最長上公升子串行

北大郭煒老師講的能採用動態規劃求解問題的特點 1 問題具有最優子結構的性質 2 無後效性。實現動態規劃的三個步驟 1 講原問題分解為子問題 2 確定狀態以及初始狀態 邊界值 3 狀態轉移方程 人人為我 遞推型 第一步的子問題就是a i 為終點的最長上公升子串行。include includeusin...

動態規劃學習之最長上公升子串行

這個問題的關鍵是建立狀態方程dp i 儲存演算法a i 為終點的最長上公升子串行的長度,那麼dp i 的解題思路就是從前面找到比a i 小,並且具有最大dp j 0 j i 1 的j,並且在後面接上的a i 因此方程為 dp i dp j 1 0 j i 1 max dp j 除此之外,因為都是從比...