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