AcWing 1010. 拦截导弹
原题链接
简单
作者:
不知名的fE
,
2024-11-18 19:47:06
,
所有人可见
,
阅读 1
import java.util.*;
public class Main {
static final int N = 1010;
static int[] a = new int[N], f = new int[N], g = new int[N];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String[] s = sc.nextLine().split(" ");//读入数据
int n = s.length;
for (int i = 1; i <= n; i++) a[i] = Integer.parseInt(s[i - 1]);
//求解最长下降子序列(该子序列并不是严格下降的)
int res = 0;
for (int i = 1; i <= n; i++) {
f[i] = 1;
for (int j = 1; j < i; j++)
//理解本题f[i]:以a[i]结尾的最长下降子序列,因此要求a[i]前面的a[j]要满足该条件
if (a[i] <= a[j]) f[i] = Math.max(f[i], f[j] + 1);
res = Math.max(res, f[i]);
}
System.out.println(res);
//求解需要的序列个数
int idx = 0;
//初始化为零,指向下一个要创建(还没创建)的序列,
//因为从0开始,因此也是序列的个数
for (int i = 1; i <= n; i++) {
int t = 0;//寻找大于等于a[i]的最小的g[t]
/**
* 这里解释:g数组一定是有序的,并且在本题中g数组为严格单调递增的
* 因为本题对g数组的赋值采用的是每个序列尾部(该序列的最小值),
* 如果要插入的a[i]严格大于每一个g(idx以内),
* 就新创建一个序列,因此新的序列的g一定严格大于上一个g
*/
while (t < idx && g[t] < a[i]) t++;
if (t >= idx) idx++;
g[t] = a[i];
}
System.out.print(idx);
}
}