防衛飛彈 動態規劃入門題)

2021-04-07 13:55:18 字數 1018 閱讀 2224

一種新型的防衛飛彈可截擊多個攻擊飛彈.它可以向前飛行,也可以用很快的速度向下飛行,可以毫無損傷地截擊進攻飛彈,但不可以向後或向上飛行.但有乙個缺點,儘管它發射時可以達到任意高度,但它只能截擊比它上次截擊飛彈時所處高度低或者高度相同的飛彈.現對這種新型 防衛飛彈進行測試,在每一次測試中,發射一系列的測試飛彈(這些飛彈發射的間隔時間固定,飛行速度相同),該防衛飛彈所能獲得的資訊包括各進攻飛彈的高度,以及它們發射次序.現要求編一程式,求在每次測試中,該防衛飛彈最多能截擊的進攻飛彈數量,乙個飛彈能被截擊應滿足下列兩個條件之一:

它是該次測試中第乙個被防衛飛彈截擊的飛彈;

它是在上一次被截擊飛彈的發射後發射,且高度不大於上一次被截擊飛彈的高度的飛彈.

輸入格式:

從當前目錄下的文字檔案"catcher.dat"讀入資料.該檔案的第一行是乙個整數n(0〈=n〈=4000),表示本次測試中,發射的進攻飛彈數,以下n行每行各有乙個整數hi(0〈=hi〈=32767),表示第i個進攻飛彈的高度.檔案中各行的行首,行末無多餘空格,輸入檔案中給出的飛彈是按發射順序排列的.

輸出格式:

答案輸出到當前目錄下的文字檔案"catcher.out"中,該檔案第一行是乙個整數max,表示最多能截擊的進攻飛彈數,以下的max行每行各有乙個整數,表示各個被截擊的進攻飛彈的編號(按被截擊的先後順序排列).輸出的答案可能不唯一,只要輸出其中任一解即可.

題目講得很麻煩,歸根結底就是求一整串數中的最長不上公升序列 ,用乙個一維陣列max[ i ]來建立動態規劃狀態轉移方程,表示表示當前狀態(從i 到n)最多可擊落的飛彈數,用next[i]表示當前節點的後繼標誌:

#include

#include

using namespace std;

int h[4001],max[4001],next[4001];

int main()

}  cout<

while(head!=0)

cout<

}   

return 0;

}   

動態規劃 防衛飛彈

描述 一種新型的防衛飛彈可截擊多個攻擊飛彈。它可以向前飛行,也可以用很快的速度向下飛行,可以毫無損傷地截擊進攻飛彈,但不可以向後或向上飛行。但有乙個缺點,儘管它發射時可以達到任意高度,但它只能截擊比它上次截擊飛彈時所處高度低或者高度相同的飛彈。現對這種新型防衛飛彈進行測試,在每一次測試中,發射一系列...

攔截飛彈(動態規劃)

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

NYOJ 攔截飛彈(動態規劃)

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