傳送門
解題思路:首先求解最多攔截多少飛彈,每個飛彈有兩種情況,攔截或者不攔截,01揹包問題,但是空間複雜度比較高。我們可以考慮這樣乙個問題,攔截的最後乙個飛彈一定時最小的,因此我們從後往前找,只要這個飛彈之後沒有更小的,那麼這就是最後乙個飛彈,如果有更小的,那這個就是更小的那個飛彈的前乙個。所以我們往前遍歷,每次都找比當前高度更低的飛彈裡攔截的最多的數+1即可。
然後求解需要幾套裝置:每個飛彈都要攔截,所以第乙個一定要攔截,當飛彈高於上乙個時就要新增裝置,但是有時有跳躍性比較大的飛彈,因此每個飛彈我們都找最低的那個裝置進行攔截。後來高的飛彈還可以攔截。
ac**:
#include #include #include #include #include using namespace std;
int a[30], h[30];
int dp[30];
int max_d(int t)
h[i] = maxh+1;
maxd = max(maxd, h[i]);
} return maxd;
}int min_d(int t)
if(cur == 0) h[++num] = a[i];//沒有裝置可以攔截到
else h[cur] = a[i];
} return num;
}int main()
codevs1044攔截飛彈
這個題第一問是求最長下降子串行,第二問可以轉化成求最長上公升子串行,為什麼?因為我們每遇到有hi hj的情況 i j 都要再使用一枚飛彈,因為飛彈只處理hi hj的情況嘛,很好理解的吧 所以 如下 完全可以更短 include include include include using namesp...
code VS 1044 攔截飛彈
rt 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。輸入飛彈依次飛來的高度 雷...
codevs 攔截飛彈 1044
題目描述 description 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈...