#include <iostream>
#include <string>
#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
/*
导弹拦截
*/
int a[100001];
int f[100001];//以a[i]结尾的最长上升子序列的长度
int sys_height[100001];//系统i的最低高度
int main(){
int n = 0;
while(cin>>a[n]){
n++;
if(cin.get() == '\n') break;
}
int ans = -1;
f[0] = 1;
for(int i=1;i<n;i++){
f[i] = 1;
for(int j=0;j<i;j++){
if(a[j] >= a[i]){
f[i] = max(f[j]+1, f[i]);
}
}
ans = max(ans, f[i]);
//printf("%d %d %d\n",i,f[i], a[i]);
}
printf("%d",ans);
int sys = 1;
sys_height[0] = a[0];
for(int i=1;i<n;i++){
int sys_min = 0;//第哪一套系统的高度最小
int gap = 99999999;
for(int j=0;j<sys;j++){
if(sys_height[j] >= a[i] && gap > sys_height[j] - a[i] ){
gap = sys_height[j] - a[i];
sys_min = j;
}
}
//都满足不了
if(gap == 99999999){
sys++;
sys_height[sys-1] = a[i];
}
//update
else{
sys_height[sys_min] = a[i];
}
}
printf("\n%d", sys);
}
【动态规划】导弹拦截(O(n2))
最新推荐文章于 2024-10-12 19:44:22 发布