最少攔截系統(最長不下降子串行)

2021-08-22 10:30:49 字數 1145 閱讀 3016

題目:

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統.但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的飛彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈. 

怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裡來求救了,請幫助計算一下最少需要多少套攔截系統. 

input

輸入若干組資料.每組資料報括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔) 

output

對應每組資料輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統. 

sample input

8 389 207 155 300 299 170 158 65
sample output

2
剛開始將題目理解錯了,一位直接遍歷一遍,只要後邊乙個數比前邊的數字大就加1,但是資料太弱,就執行正確,不過 像這樣7 6 5 6 3 2 4 1 就不行,因為4直接用前邊的一攔截就可以了。因此我們可以看到,要想增加新的系統,必須前邊的每個系統的最小值小於新系統開始的高度。因此這道題就轉化成了求這個系統的最長上公升子串行問題,這個序列中有多少個元素,及需要多少個系統。

因此轉移方程為dp[i]=max(dp[i],dp[j]+1)

為什麼求最小攔截系統卻要求最大值?因為此時的最大才是可以攔截所有飛彈的狀態的最小值

因為要遍歷i點之前的所有情況,為使前面每乙個狀態都滿足,只有選擇前面所有狀態中的最大值+1,此時即為滿足條件的最小

#include #include #include #include #define maxn 30005

using namespace std;

int dp[maxn];

int height[maxn];

int main()

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

}int ans=-1;

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

ans=max(ans,dp[i]);

printf("%d\n",ans);

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