防卫导弹_动态规划
1、問題描述:來源 NWPU noj1046
一種新型的防衛(wèi)導(dǎo)彈可截?fù)舳鄠€(gè)攻擊導(dǎo)彈。它可以向前飛行,也可以用很快的速度向下飛行,可以毫無損傷地截?fù)暨M(jìn)攻導(dǎo)彈,但不可以向后或向上飛行。但有一個(gè)缺點(diǎn),盡管它發(fā)射時(shí)可以達(dá)到任意高度,但它只能截?fù)舯人洗谓負(fù)魧?dǎo)彈時(shí)所處高度低或者高度相同的導(dǎo)彈。現(xiàn)對(duì)這種新型防衛(wèi)導(dǎo)彈進(jìn)行測(cè)試,在每一次測(cè)試中,發(fā)射一系列的測(cè)試導(dǎo)彈(這些導(dǎo)彈發(fā)射的間隔時(shí)間固定,飛行速度相同),該防衛(wèi)導(dǎo)彈所能獲得的信息包括各進(jìn)攻導(dǎo)彈的高度,以及它們發(fā)射次序。現(xiàn)要求編一程序,求在每次測(cè)試中,該防衛(wèi)導(dǎo)彈最多能截?fù)舻倪M(jìn)攻導(dǎo)彈數(shù)量,一個(gè)導(dǎo)彈能被截?fù)魬?yīng)滿足下列兩個(gè)條件之一:
a)它是該次測(cè)試中第一個(gè)被防衛(wèi)導(dǎo)彈截?fù)舻膶?dǎo)彈;
b)它是在上一次被截?fù)魧?dǎo)彈的發(fā)射后發(fā)射,且高度不大于上一次被截?fù)魧?dǎo)彈的高度的導(dǎo)彈。
2、輸入
多個(gè)測(cè)例。 每個(gè)測(cè)例第一行是一個(gè)整數(shù)n(n不超過100),第二行n個(gè)整數(shù)表示導(dǎo)彈的高度(數(shù)字的順序即發(fā)射的順序)。 n=0表示輸入結(jié)束。?
3、輸出
每個(gè)測(cè)例在單獨(dú)的一行內(nèi)輸出截?fù)魧?dǎo)彈的最大數(shù)目。
4、樣例
輸入樣例
5 5 6 100 6 61 0輸出樣例
2
5、問題解析:本質(zhì)就是求最長(zhǎng)遞減子序列,可以參考動(dòng)態(tài)規(guī)劃之最長(zhǎng)遞增子序列的實(shí)現(xiàn)和解析。
6、下面是代碼:
#include<iostream> #include<vector>using namespace std;int main() {int n;int i, j;//輔助變量int pos=0;while (cin >> n) {if (0 == n)break;vector<int> arr(n);vector<int> dp(n);//dp[i]代表以arr[i]結(jié)尾的最長(zhǎng)的遞減子序列的值for (i = 0; i < n; ++i) {cin >> arr[i];dp[i] = 1;//都初始化為1}//下面對(duì)dp[i]進(jìn)行運(yùn)算for (i = 1; i < n; ++i) {for (j = 0; j < i; ++j) {if (dp[i] <= dp[j] && arr[i] <= arr[j]) {dp[i] = dp[j] + 1;}}//end j}//end i//找出最大的值for (i = 0; i < n; ++i) {if (dp[pos] < dp[i]) {pos = i;}}cout << dp[pos] << endl;pos = 0;}//end while }總結(jié)
- 上一篇: 「鹿班智能设计平台」是如何工作的
- 下一篇: LeetCode算法题5:DFS/BFS