解題思路:
這道題目的第乙個問題就是求最長下降子串行,直接用乙個dp就可以了;
而對於第二個問題,問最少用多少個系統可以攔截所有的飛彈,我剛還是的思路是不斷地去求最長下降子串行,指導飛彈被去完為止,但是後來我找到了這個思路的乙個bug,然後想我們可以直接維護乙個陣列,陣列裡面就是各自系統中最小的飛彈的高度,由於我們需要把所有的飛彈都給截獲,所以對於每乙個飛彈我們要麼就是用乙個新系統來截獲,要麼就使用正在使用中的乙個飛彈進行截獲,然後最優的方法是用正在使用中的飛彈系統中 高度大於並且最接近於當前飛彈高度 的系統進行截獲,如果沒有這樣的系統,就直接再啟動乙個系統;(我覺得第二個問題像貪心),然後我想到如果我們每次都直接用sort維護這個陣列然後再使用二分覺得時間複雜度可能會比較高,但估計也不會超時,在這裡我是用使用乙個set來維護的。
**:
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1e3+5;
int a[maxn]
, cnt;
int f[maxn]
, pre[maxn]
, num;
bool vis[maxn]
;set<
int> st;
intmain
(void
) maxx =
max(maxx, a[i]);
}printf
("%d\n%d\n"
, res, st.
size()
);return0;
}
總結:我發現對於這種dp型別的問題,似乎正確的答案都不會是一遍的最優子結構堆積而成的,我們需要同時考慮多種路徑(系統),直接得到乙個最優解。 AcWing1010 攔截飛彈
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
Acwing 1010 攔截飛彈 單調子串行
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...
1010 攔截飛彈
某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷達給出...