最長上公升子串行不是最大上公升子串行,思想一樣但結果可能不一樣
比如:序列(100, 1, 2, 3)的最大上公升子串行和為100,而最長上公升子串行為(1, 2, 3)。
現在我們要解決的問題就是在給定的陣列中找出最長上公升子串行:先給乙個栗子
給定的陣列 a[7] =
思想:這裡用到的是乙個自底向上的尋找最優子結構的的思想。粗俗來說:如果你想要得到七個數裡面的最長子序列,你可以先找前6個數裡面的最長子序列,同理,你又必須得找前5個數裡面的最長子序列,直到子串行為1
大體的步驟是這樣的
d[i]:用陣列d 來儲存前第 i 個數的最長子序列,i 表示的就前幾個數
毫無疑問 -------------------------------d[1]=1 : 表示第乙個數他的最長子序列是1
--------------------------------d[2]=d[1]+1=2 : 表示前兩個數中,最長上公升子串行為2
--------------------------------d[3]=d[1]+1=2 : 因為4 < 6 所以不能用 d[2]+1,但 1<4 所以 是 d[1]+1。 , 等
---------------------------------d[4]=d[1]+1=2 : 4和6 都大於2 所以不能用d[2],d[3]。 , 等
---------------------------------d[5]=d[4]+1=3 : 3 >2 所以 可以d[4]+1=2+1=3 。
----------------------------------d[6]=d[5]+1= 4 : d[5]+1=3+1=4 。
----------------------------------d[7]=4 : 或者
如果上面的步驟能看明白,只是在思想上是通的了,現在就差用**來實現我們的思想:
#include #include using namespace std;
int main()
,m=-1,d[1001]=;
for(int i=1;i<=n;i++)
d[1]=1; //陣列長度為一的時候,最長子序列也是一
if(n<2)
cout
d[i]=d[i]+1;// 在第i個之前加上自身 等於第i個數的最長上公升子串行
m = max(d[i],m); // 得到d[i] 中最大得數}}
cout<}
return 0;
}
動態規劃 之 最長上公升子串行
乙個數的序列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...
動態規劃之最長上公升子串行
動態規劃指的是將乙個繁雜的問題分解成子問題之後,通過求解子問題的最優解,從而求得整體最優解。輸入資料 輸入的第一行是序列的長度n 1 n 1000 第一行給出序列的n個整數,這些整數的取值範圍在0 10000.輸出要求 最長上公升子串行的長度。輸入樣例 7 1 7 3 5 9 4 8 輸出樣例 範例...