週末夜校 飛彈防禦系統 遞迴演算法

2021-10-11 02:58:54 字數 2034 閱讀 2446

湖南大學資訊科學與工程學院第15屆生涯規劃節週末夜校之c++講座

(date:20201205,面向2020級大一新生)

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

每組輸入有兩行, 

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

第二行,輸入k個正整數,表示k枚飛彈的高度,按來襲飛彈的襲擊時間順序給出,以空格分隔。

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

8300 207 155 300 299 170 158 65

1、找到遞迴開始狀態,即遞迴入口;

2、呼叫遞迴函式;

3、判斷遞迴引數合法性,制定「由錯誤導致的」遞迴終止條件;

4、為合法的引數執行運算操作;

5、找到遞迴邊界並判斷,制定「由遞迴邊界導致的」遞迴終止條件;

6、確定下一步的遞迴方向,用更新的引數呼叫遞迴;

7、函式返回上一層遞迴前,還原在本層遞迴中改變的引數。

每個飛彈可以選擇打或者不打,如果選擇打了第一發300的,那麼如果再選打第二發207,則後續只能打到155,65兩個飛彈,這樣總共只能打4個飛彈。但是如果打了第一發300以後,第二第三的207,155都不打,那麼可以繼續打到第四發300的飛彈,而從第5發飛彈開始高度都是遞減的,因此後續的飛彈都能打到,這樣最優解就能打到6發飛彈。

1、找到遞迴開始狀態,即遞迴入口:arr作為飛彈高度的儲存位置,從第一發飛彈開始計算,即arr[1]。

2、呼叫遞迴函式:每一發飛彈可以打或者不打。因此在主函式裡面呼叫了兩次defend。defend有兩個引數,第乙個引數cur代表當前考慮編號幾的飛彈,def代表打還是不打,1是打,0是不打。

3、判斷遞迴引數合法性,制定「由錯誤導致的」遞迴終止條件:本題中不存在該類情況。

4、為合法的引數執行運算操作:curheight引數記錄了當前能打的最高位置,且初始為-1。如果def標記位為1,且curheight比arr[cur](當前考慮的飛彈的高度)要高,就可以執行打的操作。如果curheight=-1說明一發還沒有打過,因此可以直接打。打完飛彈以後將該飛彈的高度更新為下一次可打的最高高度,並且curhit(已打數量)加一。

5、找到遞迴邊界並判斷,制定「由遞迴邊界導致的」遞迴終止條件:如果cur=n,即當前已經考慮到最後乙個飛彈,就判斷curhit和maxn的關係,如果curhit(已打數量)比儲存的打飛彈數量最大值要多,那麼更新max為當前的已打數量curhit。

6、確定下一步的遞迴方向,用更新的引數呼叫遞迴:下一層搜尋時,飛彈序列cur+1,搜尋方向為1(打下乙個)或0(不打下乙個)。

7、函式返回上一層遞迴前,還原在本層遞迴中改變的引數:本層中對於curhit(已打數量)和curheight(可打高度)進行了更新,在返回上一層之前,將這兩個引數用tmp1,tmp2兩個快取位強制更新(避免相同高度重複計算),還原成未考慮當前飛彈之前的情況,並返回上一層遞迴,重新對當前的飛彈進行考慮(1或者0)。

#includeusing namespace std;

int n=0;

int flag=0;

int maxn=0;

int curhit=0;

int curheight=-1;

int arr[1001];

void defend(int cur,int def)

} if(cur==n) //遞迴終止條件,已經考慮所有飛彈

defend(cur+1,1); //打完這乙個飛彈,考慮下乙個飛彈打還是不打。考慮結束後,函式在該位置返回繼續執行。

defend(cur+1,0); //考慮沒有打的飛彈

curheight=tmp1;

}int main()

defend(1,1); //打或不打都可以

defend(1,0);

cout《本題的dp解法:

飛彈防禦系統

飛彈防禦系統 為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。資料範圍 1 n 50 輸入樣例 5 3 5 2 4 1 0輸出樣例 2樣例解釋 對於給出樣例,最少需要兩套防禦系統。一套擊落高度為3,4的飛彈,另一套擊落高...

防禦飛彈演算法

演算法效率的時間空間效率完全沒有考慮 大鳥無噴 但是可能是最直觀的,最白痴的思路。沒有運用 演算法思想,就是保證沒讀過演算法相關書籍的任何人都能讀懂。題目出處 題目如下 防禦飛彈 problem 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能...

飛彈防禦系統 飛彈攔截系統

題目鏈結 引言 請忽略 今天是小白acm集訓的日子,然後資料結構實在是太難了,真是學不動了,然後就只能無助地去複習以前的題了,記得以前在sdut程設二裡面有一道題叫最少攔截系統,它是一道貪心,我個人覺得最長上公升子串行的思路跟它有些相似。我們先分析一下這道題,引入一下這道最少攔截系統的題幹和 最少攔...