【OpenJ_Bailian
攔截導彈
Descriptions:
某國為了防御敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以后每一發炮彈都不能高于前一發的高度。某天,雷達捕捉到敵國的導彈來襲,并觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截后面的導彈,再攔截前面的導彈。
Input
輸入有兩行,
第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),
第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。
Output
輸出只有一行,包含一個整數,表示最多能攔截多少枚導彈。
Sample Input
8
300 207 155 300 299 170 158 65
Sample Output
6
題目鏈接:
https://vjudge.net/problem/OpenJ_Bailian-2945
乍一看我以為是最長不增長子序列,然后就玩了一次小聰明,把數倒過來輸入,然后按最長增長子序列來做,然后悲劇發生了,我改了2個小時的bug,改到懷疑人生,但就是不對,最后老老實實的重新寫,AC了才發現“必須按來襲導彈襲擊的時間順序,不允許先攔截后面的導彈,再攔截前面的導彈”,崩潰了!!!!
說一下思路吧,dp[i]以a[i]為前綴的子序列長度,狀態轉移方程:如果a[i]<=a[j],那么a[j]前面肯定可以放a[i],dp[i]=max(dp[i],dp[j]+1)。
AC代碼
1 #include <iostream>
2 #include <cstdio>
3 #include <fstream>
4 #include <algorithm>
5 #include <cmath>
6 #include <deque>
7 #include <vector>
8 #include <queue>
9 #include <string>
10 #include <cstring>
11 #include <map>
12 #include <stack>
13 #include <set>
14 using namespace std;
15 int a[50];
16 int dp[50];
17 int maxn=0;
18 int main()
19 {
20 int k;
21 cin >> k;
22 for(int i=0; i<k; i++)
23 {
24 cin >>a[i];
25 dp[i]=1;//初始狀態,以a[i]為前綴都為1
26 }
27 for(int i=1; i<k; i++)
28 for(int j=0; j<i; j++)
29 {
30 if(a[i]<=a[j])
31 {
32 dp[i]=max(dp[i],dp[j]+1);//狀態轉移方程
33 maxn=max(dp[i],maxn);
34 }
35 }
36 cout << maxn << endl;
37 }
總結
以上是生活随笔為你收集整理的【OpenJ_Bailian的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDS Mysql中binlog日志查看
- 下一篇: 英语文档之vivado界面