HDU 1257 最少拦截系统(LIS)

最少拦截系统

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

const int maxn = 30000+5;
int n;
int nums[maxn];
int dp[maxn];//以第i个元素结尾的最长递增子序列  i从1算起
int ans;
//从题目中可以得知,拦截系统得拦截高度依次降低,所以一开始我是打算求最长下降子序列,后来发现行不通,这种方法只能够求出每次最多拦截得导弹得个数。
//所以就开始改变方法,后来发现,如果后面得导弹得高度比前面得高,那么一次肯定不能拦截完,所以只要求出最长上升子序列,就可以求出需要的最少拦截系统。

void LCS() {
    memset(dp, 0, sizeof(dp));

    dp[1] = 1;

    for(int i = 2; i <= n; ++i) {
        dp[i] = 1;
        for(int j = 1; j < i; ++j) {
            if(nums[j-1] < nums[i-1]) {
                dp[i] = max(dp[i], dp[j]+1);
            }
        }
    }

    ans = 0;
    for(int i = 1; i <= n; ++i) {
        if(ans < dp[i]) {
            ans = dp[i];
        }
    }
}

int main(void) {
    freopen("data.in", "r", stdin);

    while(scanf("%d", &n) == 1) {
        memset(nums, 0, sizeof(nums));
        for(int i = 0; i < n; ++i) {
            scanf("%d", &nums[i]);
        }

        LCS();
        printf("%d\n", ans);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/80949548