ACwing 187 飛彈防禦系統 DFS

2021-10-05 23:54:37 字數 1333 閱讀 1053

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

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

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

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

輸入格式

輸入包含多組測試用例。

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

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

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

輸出格式

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

資料範圍

1≤n≤50

輸入樣例:

53 5 2 4 1

0輸出樣例:

樣例解釋

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

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

解題思路:

用up 、 down 陣列記錄下單調上公升和下降序列的最後乙個元素。

新的元素,列舉放入 1.已有的單調上公升序列 or 自己單成乙個單調上公升序列(但是能放在上公升中就不會單成乙個序列 算剪枝把)

2.已有的單調下降序列 or 單成乙個

因為是求最小值: 1.全域性最小量 2.迭代加深

#include

#include

using

namespace std;

const

int n=50;

int up[n]

,down[n]

;//記錄下每個上公升 、下降序列的末尾值

int dd[n]

;int n;

int mins=

1<<30;

void

dfs(

int index,

int su,

int sd)

if(su+sd >=mins)

return

;//列舉放入上公升中

int flag1=1;

for(

int i=

0;i< su ;i++)}

if( flag1 ==1)

//列舉放入下降中

int flag2=1;

for(

int i=

0;i< sd ;i++)}

if( flag2 ==1)

return;}

intmain()

return0;

}

AcWing187 飛彈防禦系統

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

AcWing 187 飛彈防禦系統

原題鏈結 考察 dfs dp 思路 很像noi1999的飛彈攔截,但是這道題的決策需要決定是加入上公升子串行還是下降子串行,然後判斷加入到哪乙個上公升子串行.多決策問題多用dp或搜尋,這道題用dp需要記錄的狀態有 當前第幾個數,當前上公升子串行個數,當前下降子串行個數,但關鍵是當前最優解不一定能推到...

飛彈防禦系統

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