最長下降子串行 3 5

2021-08-12 00:21:17 字數 1005 閱讀 6137

題目:

給定乙個整數序列,輸出它的最長遞減(注意不是「不遞增」)子串行。

輸入包括兩行,第一行包括乙個正整數n(n<=1000),表示輸入的整數序列的長度。第二行包括用空格分隔開的n個整數,整數範圍區間為[-30000,30000]。

輸出為一行,最長遞減子串行的結果,數字間用空格分隔(測試case中只會有乙個最長遞減子串行)。

樣例輸入

8

9 4 3 2 5 4 3 2

樣例輸出

9 5 4 3 2

思路:這道題不能使用優化的最長上公升子串行,因為它要記錄路徑,優化的最長上公升子串行dp[i]表示的是長度為i+1的上公升子串行中末尾元素的最小值,並不是路徑。所以還是用o(n²)的演算法;

dp[i]表示到前i個元素的最大長度。如果a[i]>a[j],dp[i]=max(dp[i],dp[j]+1)。j從1到i;

遞減序列和遞增相同。

每次記錄當前最優解的上乙個節點,最後用棧構造最優解。

#includeusing namespace std;

int main()

, n, res = 1;//ans記錄路徑

cin >> n;

fill(dp + 1, dp + n + 1, 1);//最小長度至少為1

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

cin >> a[i];

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

}if (dp[i] > dp[res])

res = i;

} //cout << dp[res];

stackq;

for (int i = res; i != 0; i = ans[i])

q.push(a[i]);

cout << q.top();

q.pop();

while (!q.empty())

return 0;

}

最長不下降子串行

a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...

最長不下降子串行

最長不下降子串行解法 第一種就是普通的dp方法 for int i 1 i n i dp 0 1 for int i 1 i n i ans max ans,dp i cout 主要記錄一下n logn的寫法 二分 主要思路 用乙個陣列 b 來記錄最長的子串行 一開始讓b 1 a 1 陣列a為輸入的...

最長不下降子串行

例子 openjudge 4977 怪盜基德的滑翔翼 描述怪盜基德是乙個充滿傳奇色彩的怪盜,專門以珠寶為目標的超級盜竊犯。而他最為突出的地方,就是他每次都能逃脫中村警部的重重圍堵,而這也很大程度上是多虧了他隨身攜帶的便於操作的滑翔翼。有一天,怪盜基德像往常一樣偷走了一顆珍貴的鑽石,不料卻被柯南小朋友...