防衛導彈_動態規劃

1、問題描述:來源 NWPU noj1046

一種新型的防衛導彈可截擊多個攻擊導彈。它可以向前飛行,也可以用很快的速度向下飛行,可以毫無損傷地截擊進攻導彈,但不可以向後或向上飛行。但有一個缺點,儘管它發射時可以達到任意高度,但它只能截擊比它上次截擊導彈時所處高度低或者高度相同的導彈。現對這種新型防衛導彈進行測試,在每一次測試中,發射一系列的測試導彈(這些導彈發射的間隔時間固定,飛行速度相同),該防衛導彈所能獲得的信息包括各進攻導彈的高度,以及它們發射次序。現要求編一程序,求在每次測試中,該防衛導彈最多能截擊的進攻導彈數量,一個導彈能被截擊應滿足下列兩個條件之一:

a)它是該次測試中第一個被防衛導彈截擊的導彈;
b)它是在上一次被截擊導彈的發射後發射,且高度不大於上一次被截擊導彈的高度的導彈。


2、輸入

多個測例。
每個測例第一行是一個整數n(n不超過100),第二行n個整數表示導彈的高度(數字的順序即發射的順序)。
n=0表示輸入結束。 


3、輸出

每個測例在單獨的一行內輸出截擊導彈的最大數目。


4、樣例

輸入樣例

5
5 6 100 6 61
0

輸出樣例

2


5、問題解析:本質就是求最長遞減子序列,可以參考動態規劃之最長遞增子序列的實現和解析。


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]結尾的最長的遞減子序列的值
		for (i = 0; i < n; ++i) {
			cin >> arr[i];
			dp[i] = 1;//都初始化爲1
		}
		//下面對dp[i]進行運算
		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	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章