最長不下降子串行的兩種解法

2021-08-15 03:29:22 字數 938 閱讀 2251

第一種:o(n^2)的複雜度的解法.

//這裡dp陣列記錄的是到第i個位置,當前最長的子串行的長度

#include

#include

#include

#include

using

namespace

std;

int dp[105];

int a[105];

int main()

for(i=0;i1;//對每個新的位置,初始化最長長度為1

for(j=0;j//對於i之前的每個元素和a[i]進行比較,不斷更新長度值

}int ans=0;

for(i=0;icout

《第二種:o(nlogn)的複雜度的解法

//dp記錄的是最長子序列中的元素,並且可以輸出最長子序列中的元素

#include

#include

#include

#include

using

namespace

std;

int a[105];

int dp[110];

//若a[i]大於dp的末位數,直接加在後面

//若不是,查詢第乙個大於value的位置

int findposition(int b,int value,int left,int length)

}}int main()

dp[1]=a[0];

int length=1;

for(i=1;iint position=findposition(dp,a[i],1,length);

dp[position]=a[i];

length=max(length,position);

}cout

cout

<" ";

}

最長不下降子串行

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