1. 程式人生 > >PKU-攔截導彈

PKU-攔截導彈

題目連結

https://www.nowcoder.com/practice/dad3aa23d74b4aaea0749042bba2358a?tpId=40&tqId=21408&tPage=1&rp=1&ru=/ta/kaoyan&qru=/ta/kaoyan/question-ranking

題目描述

某國為了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。 

輸入描述:

每組輸入有兩行,
第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),
第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。

輸出描述:

每組輸出只有一行,包含一個整數,表示最多能攔截多少枚導彈。

示例1

輸入

複製

8
300 207 155 300 299 170 158 65

輸出

複製

6

題解:DAG模型。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main(){
	int n;
	while (cin >> n){
		int ans = 1;
		vector<int> d(n, 0);
		vector<int> dp(n, 1);
		for (int i = 0; i < n; i++){
			cin >> d[i];
		}
		for (int i = 1; i < n; i++){
			for (int j = 0; j < i; j++){
				if (d[j] >= d[i]){
					dp[i] = max(dp[i], dp[j] + 1);
				}
			}
			ans = max(ans, dp[i]);
		}
		cout << ans << endl;
	}
	return 0;
}