题解 | #拦截导弹#

拦截导弹

https://www.nowcoder.com/practice/218f3db1f66d465bbf9578625aa90785

import java.util.*;

public class Main {
    static int n;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        int[] nums = new int[n];
        for(int i = 0; i < n; i ++)
            nums[i] = in.nextInt();

        System.out.println(func1(nums));
        System.out.println(func2(nums));
    }

    // 最多拦截多少个导弹,线性dp
    public static int func1(int[] nums) {
        int n = nums.length;
        int[] f = new int[n + 1];

        for(int i = 1; i <= n; i ++) {
            f[i] = 1;
            for(int j = 1; j < i; j ++) {
                // 高度相等,两颗导弹均可被拦截
                if(nums[i - 1] <= nums[j - 1]){
                    f[i] = Math.max(f[i], f[j] + 1);
                }
            }
        }

        int ans = 0;
        for(int i = 0; i <= n; i ++)
            ans = Math.max(ans, f[i]);

        return ans;
    }

    // 最少要多少个系统
    public static int func2(int[] nums) {
        int n = nums.length;
        int[] f = new int[n + 1];

        for(int i = 1; i <= n; i ++) {
            f[i] = 1;
            for(int j = 1; j < i; j ++) {
                // 严格递增,高度相等的可以被拦截,因此算为一个系统
                if(nums[i - 1] > nums[j - 1]){
                    f[i] = Math.max(f[i], f[j] + 1);
                }
            }
        }

        int ans = 0;
        for(int i = 0; i <= n; i ++)
            ans = Math.max(ans, f[i]);

        return ans;
    }
}
全部评论

相关推荐

评论
2
收藏
分享
牛客网
牛客企业服务