動態規劃指的是將乙個繁雜的問題分解成子問題之後,通過求解子問題的最優解,從而求得整體最優解。輸入資料:
輸入的第一行是序列的長度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 除此之外,因為都是從比...