飛彈攔截 DP O nlogn 演算法

2021-09-29 01:21:06 字數 1379 閱讀 6751

題目鏈結

o(n)dp:

dp[len],表示長度為len的序列最優的末尾高度是dp[len].

最長不上公升序列

如果不大於dp[len],dp[++len]=h[i]。否則將1-len長度的最接近且小於h[i]的位置換成h[i](降序二分查詢)。換成更高的,這樣h[i]後面就可以打更多的飛彈了。

核心**:

int len=0;

dp1[

++len]

=h[1];

for(

int i=

2;i<=n;i++

)}

最長不下降序列:

區別就是公升序二分查詢,找到最接近a[i]求大於a[i]的位置。

核心**:

int len=0;

dp1[

++len]

=h[1];

for(

int i=

2;i<=n;i++

)}

二分查詢要求有序,那麼dp能保證有序嗎?

在最長不上公升序列距離 a=dp[b]

1: (2 … 5) :假設dp[b]=5,設5>a,a是以2為結尾的長度,在此時dp[a]不等於2,因為b(以5為結尾序列長度)>a(以2為結尾序列長度),則在2~5一定也有長度為a的序列結尾點(因為5不能連線到2後面,只能連線到大於等於他的數後面),在之間在二分查詢是2是第乙個小於這個結尾點的數,原本dp[a]=2會被覆蓋成那個數,所以此時的dp[a]>=(5==dp[b])。

2: (5 … 2):這就很顯然 2最次也可以連線到5後面,dp[2]>dp[5].

關於第二問:實際是求最長上公升序列。

還有這兩個乙個是用upper,lower二分。因為不上公升序列代替等於比他更小的,因為序列高度可以重複。上公升序列則只比他大的,並要防止代替後出現重複的情況,只能代替lower位置的。

#include

using

namespace std;

int dp1[

100010

],dp2[

100010

],h[

100010];

intmain()

}int ans1=len;

len=0;

dp2[

++len]

=h[1];

for(

int i=

1;i<=n;i++)}

int ans2=len;

printf

("%d\n%d"

,ans1,ans2)

;return0;

}

演算法訓練 攔截飛彈

演算法訓練 攔截飛彈 時間限制 1.0s 記憶體限制 256.0mb 問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,...

演算法訓練 攔截飛彈

題目鏈結 錦囊2 求一套系統攔截的飛彈最大值為最長不下降子串行問題,用動態規劃。求最少多少套系統需要使用貪心法,每枚後面的炮彈使用能攔截它的最低的系統。問題描述 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮...

演算法 攔截飛彈問題

攔截飛彈問題 20分 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須...