原題鏈結
考察:dfs+dp
思路:很像noi1999的飛彈攔截,但是這道題的決策需要決定是加入上公升子串行還是下降子串行,然後判斷加入到哪乙個上公升子串行.
多決策問題多用dp或搜尋,這道題用dp需要記錄的狀態有:當前第幾個數,當前上公升子串行個數,當前下降子串行個數,但關鍵是當前最優解不一定能推到全域性最優解,所以需要用dfs.
在飛彈攔截中,發現的性質是覆蓋序列最少的嚴格上公升子串行個數 = 最長非上公升子串行長度.同理嚴格下降子串行個數 = 最長非下降子串行長度.dfs列舉即可,注意加上最優性剪枝:upx+downx>=ans (因為是最小步數,所以假設當前是最少的情況.)
1 #include 2 #include 3 #include 4using
namespace
std;
5const
int n = 55,inf = 0x3f3f3f3f;6
intn,a[n],ans,up[n],down[n];
7void dfs(int idx,int upx,int downx)//
上公升子串行個數,下降子串行個數 8
11int k = 0;//
找到最大的up[k]12
while(k//
只用下降子串行掩蓋需要的個數
13int t =up[k];
14 up[k] =a[idx];
15 dfs(idx+1,max(k+1
,upx),downx);
16 up[k] =t;
17 k = 0;18
while(ka[idx]) k++;//
只用上公升子串行掩蓋需要的個數
19 t =down[k];
20 down[k] =a[idx];
21 dfs(idx+1,upx,max(downx,k+1
));22 down[k] =t ;23}
24int
main()
2533
return0;
34 }
AcWing187 飛彈防禦系統
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。例如,一套系統先後攔截了高度為 3 33 和高度為 4 44的兩發飛彈,那麼接下來該系統就只能攔截高度大於 4 44 的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需...
ACwing 187 飛彈防禦系統 DFS
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直 嚴格單調 上公升要麼一直 嚴格單調 下降。例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就...
飛彈防禦系統
飛彈防禦系統 為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。資料範圍 1 n 50 輸入樣例 5 3 5 2 4 1 0輸出樣例 2樣例解釋 對於給出樣例,最少需要兩套防禦系統。一套擊落高度為3,4的飛彈,另一套擊落高...