飛彈防禦系統(迭代加深dfs 貪心)

2021-10-03 15:11:37 字數 1392 閱讀 8873

為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。

一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。

例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。

給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就可以將它們全部擊落。

輸入格式

輸入包含多組測試用例。

對於每個測試用例,第一行包含整數n,表示來襲飛彈數量。

第二行包含n個不同的整數,表示每個飛彈的高度。

當輸入測試用例n=0時,表示輸入終止,且該用例無需處理。

輸出格式

對於每個測試用例,輸出乙個佔據一行的整數,表示所需的防禦系統數量。

資料範圍

1≤n≤50

輸入樣例:

5

3 5 2 4 1

0

輸出樣例:

2
樣例解釋

對於給出樣例,最少需要兩套防禦系統。

一套擊落高度為3,4的飛彈,另一套擊落高度為5,2,1的飛彈。

思路:貪心的思想: 每次加入到乙個末尾元素與當前數最接近的遞增或遞減序列(末尾元素小於h[u]且最大的或大於h[u]且最小的)

所以可以用兩個陣列up[i]down[i]分別表示第i個遞增序列和和遞減序列的末尾元素,然後搜尋時,每次按照以上原則盡可能加入到編號靠前的序列就是滿足上述思想的方案。

dfs迭代:規定乙個當前能搜尋飛彈攔截系統的最大個數max_cnt(即:答案cnt),從0開始,每次dfs一遍,如果當前cnt下無法攔截所有飛彈,則cnt++(就是搜尋的步長+1)再dfs,直到合法為止(這就是乙個迭代加深的過程),則此時的cnt即為答案。

完整**:

#include using namespace std;

int n,h[55],up[55],down[55];//up[i]和down[i]分別表示第i個遞增序列和和遞減序列的末尾元素

bool dfs(int u,int unum,int dnum,int max_num)//u表示當前列舉到的h的第u個數,unum和dnum表示上公升和下降序列個數,max_num表示當前迭代的答案(即:序列最大個數)

}if(!flag)

//試著把當前高度h[u]加入到乙個遞減序列,具體操作同上

flag=false;

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

return 0;

}

迭代加深dfs優化

當普通dfs搜尋答案時,有時會有搜尋的深度較深狀態較多,而答案所在的深度卻比較小的情況。比如說下面這個圖中,目標狀態是紅框的那個點,它的深度很小,但是左側有很多的狀態,普通dfs必須要搜完左側所有狀態才會搜到目標狀態,這樣就很容易超時。對此可以在dfs的時候限定乙個深度的狀態,這個深度是從小到大列舉...

ACwing 187 飛彈防禦系統 DFS

為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直 嚴格單調 上公升要麼一直 嚴格單調 下降。例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就...

飛彈防禦系統

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