最長遞增子串行LIS

2021-09-17 21:25:17 字數 1097 閱讀 9890

題目:

為防禦飛彈襲擊,開發一套飛彈連線系統,但是有缺陷:雖第一法炮彈能夠達到任意高度,但以後每一發飛彈都不能高於前一發的高度。某天,觀測到飛彈一次飛來的高度,請計算這套系統能攔截多少飛彈。必須按照來襲飛彈的時間順序,不允許先攔截後面的飛彈,再攔截前邊的飛彈。

輸入格式:

第一行:輸入雷達捕捉到的敵國飛彈的數量k(k<=25),

第二行:輸入k個正常數,表示k枚飛彈的高度,按照來襲飛彈的襲擊時間給出,以空格分割。

輸出格式:

每組輸出只有一行,包含乙個整數,表示最多能攔截多少枚飛彈

樣例輸入:

8300 207 155 300 299 170 158 65

輸出格式:

6演算法中最核心的部分:

遞推關係:

f[1]=1;

f[i]=max;

#include

int list[26]

;//按襲擊事件循序儲存襲擊飛彈高度

int dp[26]

;//dp【i】用來儲存第i個飛彈前的最長不增子序列長度

int max

(int a,int b)

int main()

for(int i=

1;i<=n;

++i)

} dp[i]

=tmax;

} int ans=1;

for(int i=

1;i<=n;

++i)

printf

("%d"

,ans)

;return0;

}

時間複雜度o(n*n)

空間複雜度o(n)

總結:1、自己的感受:演算法最難的地方已經成為核心演算法,在這道題裡面是遞推公式。只

要寫出遞推公式,剩下的就只要照著寫就可以了。

2、要將大的問題切分成許多子問題,要像遞推求解一樣,一步步求得每個子問題的答案,進而由這些答案推出後續子問題的答案。

最長遞增子串行 LIS

對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...

最長遞增子串行 LIS

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...

最長遞增子串行(LIS)

300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...