dp訓練 最長上公升子串行(列印元素)

2021-08-22 06:01:29 字數 1205 閱讀 7157

題目只要求求最長子序列元素個數,在此做一拓展,列印出了子串行中的元素。

最長子序列如何求得前文有述,在此不做介紹。僅介紹子串行元素的列印方法。

此處不能僅僅定義乙個dp[ ]陣列,可行的方法是定義乙個dp結構體,包含長度和前乙個序號兩個量,定義如下:

struct subdp[1001];

因為最長子序列的求法是先擬定最末的元素,然後比較得出前面上公升序列元素數目最大的元素,在這個過程中可以進行記錄:

for(int i=2;i<=n;i++)

}}

描述

乙個數的序列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)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8).

你的任務,就是對於給定的序列,求出最長上公升子串行的長度。

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

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

樣例輸入

7

1 7 3 5 9 4 8

樣例輸出

4
下面給出完整**:

#includestruct subdp[1001];

int val[1001];

void print(int n)

else

}int main()

dp[1].length=1;

for(int i=2;i<=n;i++)

}} int tmp; //儲存最長子序列最後一位的序號 。

int cmp=0; //儲存最大值 。

for(int i=1;i<=n;i++) }

printf("%d\n",cmp);

print(tmp);

return 0;

}

Dp 最長上公升子串 最長上公升子串行

乙個數的子串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,5,9 等等。這些子串中最長...

最長上公升子串行(DP)

time limit 3000ms memory limit 65536k 有疑問?點這裡 乙個數的序列bi,當b 1 b 2 b s的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a 1,a 2,a n 我們可以得到一些上公升的子串行 a i1,a i2,a ik 這裡1 i 1 i 2 i...

最長上公升子串行(Dp)

lis問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。例如 對於長度為6的序列 2,7,3,4,8,5 它的最長上公升子串行為 2,3,4,5 但如果限制一定要包含第2個元素,那滿足此...