1. 程式人生 > >九度OJ-1112-導彈攔截-最長不增子序列

九度OJ-1112-導彈攔截-最長不增子序列

研究生 -h 計算 不能 problems ear 來源 分隔 std

題目1112:攔截導彈

時間限制:1 秒

內存限制:32 兆

特殊判題:

提交:5218

解決:2603

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

輸入:
每組輸入有兩行, 第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),

第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。

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

樣例輸入:
8
300 207 155 300 299 170 158 65
樣例輸出:
6
來源:
2007年北京大學計算機研究生機試真題
#include <stdio.h>
int max(int a, int b)    {return a>b?a:b;}
int list[26];
int dp[26];
int main()    {
    int n;
    while(scanf("%d", &n) != EOF)    {
        for(int i = 1; i <= n; i++)    {
            scanf(
"%d", &list[i]); } for(int i = 1; i <= n; i++) { int tmax = 1; for(int j = 1; j < i; j++) { if(list[j] >= list[i]) { tmax = max(tmax, dp[j] + 1); } } dp[i] = tmax; }
int ans = 1; for(int i = 1; i <= n; i++) { ans = max(ans, dp[i]); } printf("%d\n", ans); } return 0; }

九度OJ-1112-導彈攔截-最長不增子序列