#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;
}
HDU 1257 最少拦截系统(LIS)
猜你喜欢
转载自blog.csdn.net/ccshijtgc/article/details/80949548
今日推荐
周排行