題目鏈結
引言(請忽略):今天是小白acm集訓的日子,然後資料結構實在是太難了,真是學不動了,然後就只能無助地去複習以前的題了,記得以前在sdut程設二裡面有一道題叫最少攔截系統,它是一道貪心,我個人覺得最長上公升子串行的思路跟它有些相似。我們先分析一下這道題,引入一下這道最少攔截系統的題幹和**:
最少攔截系統
description
提煉一下題幹,就是飛來一些飛彈,需要用炮彈系統依次攔截,它的第一發炮彈能夠到達任意的高度,但以後每一發炮彈都不能超過前一發的高度.比如如果飛來一顆比之前所有飛彈都高的飛彈,你只能增加乙個攔截系統。求攔截系統個數
input
輸入包括:飛彈總個數(正整數),飛彈依此飛來的高度(雷達給出的高度資料是不大於30000的正整數,用空格分隔)
output
對應輸出攔截所有飛彈最少要配備多少套這種飛彈攔截系統.
sample
input
8 389 207 155 300 299 170 158 65
output
2
#include
#include
int a,i;
//用來儲存飛彈的高度
int b[
100000];
//用來儲存攔截系統能夠攔截的高度
intmain()
}if(j==cnt)
//如果攔截系統都不能夠攔截,就只能夠再重新用乙個攔截系統了
}printf
("%d\n"
,cnt);}
return0;
}
這道題就是一道在已有的攔截系統裡查詢的題,因為每一套攔截系統在飛彈飛來之時會判斷能否攔截,並更新每一套攔截系統可攔截的最大高度。最後把計數的cnt輸出即可,是一道貪心策略的題目,感覺難度還可以。
但是今天這道題目可真是給我這個小白難壞了。
描述
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。
一套防禦系統的飛彈攔截高度要麼一直嚴格單調 上公升要麼一直嚴格單調 下降。
例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。
給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就可以將它們全部擊落。
輸入格式
輸入包含多組測試用例。
對於每個測試用例,第一行包含整數n,表示來襲飛彈數量。
第二行包含n個不同的整數,表示每個飛彈的高度。
當輸入測試用例n=0時,表示輸入終止,且該用例無需處理。
輸出格式
對於每個測試用例,輸出乙個佔據一行的整數,表示所需的防禦系統數量。
資料範圍
1≤n≤50
輸入樣例:
535
2410
輸出樣例:
2
樣例解釋:
對於給出樣例,最少需要兩套防禦系統。
第一種搜尋可能就是bfs,寬度優先,網上有大佬用這種方法,但介於記憶體儲存的一些寫法我不太明白,就不多說了;
第二種就dfs,就是我採用的方法,因為在剪枝的過程確實很好寫,我就只能想到這個方法了,然後可以採用宣告全域性最小值記錄和迭代深搜兩種思路,時間複雜度都是n*2^n,所以我就用前者來寫這個**。
因為小白也不怎麼會,可能注釋寫的比較繁瑣,**如下:
#include
using namespace std;
const
int n =
100;
int n;
int q[n]
;//q:依次飛來的飛彈;
int up[n]
,down[n]
;int ans;
// 記錄全域性最小變數;
void
dfs(
int x,
int su,
int sd)
// x:當前列舉到哪個數,su:上公升子串行的個數,sd:下降子串行的個數
// 情況1:將當前數放到上公升子串行中
int k =0;
//k用來遍歷當前所有上公升子串行的末尾值
while
(k < su && up[k]
>= q[x]
) k++
;// 因為序列下標是從0開始的,所以是<
int t=up[k]
;// 為後邊回溯標記當前遍歷;
up[k]
= q[x]
;//如果q[u]比末尾值大,則更新up陣列;
if(k < su)
dfs(x+
1,su,sd)
;// 如果被更新---即不用另開乙個上公升子串行m
//如果k>=su說明q[當前]小於所有上公升子串行
else
dfs(x+
1,su+
1,sd)
;//則su+1 (增加乙個系統),繼續深搜
up[k]
= t;
// 回溯之前的狀態
//情況2與上同理;
// 情況2:將當前數放到下降子串行中
k =0;
while
(k < sd && down[k]
<= q[x]
) k ++
; t = down[k]
; down[k]
= q[x];if
(k < sd)
dfs(x+
1,su,sd)
;else
dfs(x+
1,su,sd+1)
; down[k]
= t;
}int
main()
return0;
}
飛彈防禦系統
飛彈防禦系統 為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直嚴格單調上公升要麼一直嚴格單調下降。資料範圍 1 n 50 輸入樣例 5 3 5 2 4 1 0輸出樣例 2樣例解釋 對於給出樣例,最少需要兩套防禦系統。一套擊落高度為3,4的飛彈,另一套擊落高...
1048 飛彈防禦系統
時間限制 1 sec 記憶體限制 128 mb 提交 305 解決 75 提交 狀態 討論版 某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛...
DP LIS 飛彈防禦系統
為了對抗附近惡意國家的威脅,r國更新了他們的飛彈防禦系統。一套防禦系統的飛彈攔截高度要麼一直 嚴格單調 上公升要麼一直 嚴格單調 下降。例如,一套系統先後攔截了高度為3和高度為4的兩發飛彈,那麼接下來該系統就只能攔截高度大於4的飛彈。給定即將襲來的一系列飛彈的高度,請你求出至少需要多少套防禦系統,就...