华为机试真题 Java 实现书籍叠放

Posted MISAYAONE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试真题 Java 实现书籍叠放相关的知识,希望对你有一定的参考价值。

目录

题目

思路

考点

Code


题目

给定一组书的长宽,并且只有当一本书的长宽同时小于另一本书的长宽时,两书才能叠放在一起,求该组书中最多能有多少本书叠放在一起。

输入

[[20,16],[15,11],[10,10],[9,10]]

输出

3

解释

前三本可叠放在一起。

思路

1:注意审题,书A的长宽度都比B长宽大时,才能叠上去,也就是两个数字都比另外一个大才行。

2:那题目就比较好理解了,先按照长度、宽度对书籍进行排序(长度相同的,再按照宽度排序)。

3:动态规划,转移方程:dp[i] = max(dp[i], dp[j] + 1);

考点

1:动态规划

Code

import java.util.Scanner;
import java.util.*;

public class Main  
    public static int max_machine=0;

    public static void main(String[] args)  
        //处理输入
        Scanner in = new Scanner(System.in);
        String book_info = in.nextLine().replaceAll("\\\\[", "").replaceAll("\\\\]", "");
        String[] book_list = book_info.split(",");
        int[][] books = new int[book_list.length / 2][2];
        for (int i = 0; i < books.length; i++) 
            books[i][0] = Integer.parseInt(book_list[i * 2]);
            books[i][1] = Integer.parseInt(book_list[i * 2 + 1]);
        
        Arrays.sort(books, (a, b) -> (a[0] == b[0] ? b[1] - a[1] : a[0] - b[0]));
        int[] dp = new int[books.length];
        Arrays.fill(dp, 1);
        int res = 0;
        for (int i = 0; i < books.length; i++) 
            for (int j = 0; j < i; j++) 
                if (books[i][1] > books[j][1]) 
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                
            
            res = Math.max(dp[i], res);
        
        System.out.println(res);
    



以上是关于华为机试真题 Java 实现书籍叠放的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题Python实现 叠放书籍真题+解题思路+代码(2022&2023)

华为OD机试 - 叠放书籍(C 语言解题)独家

华为机试真题 Java 实现DNA序列

华为机试真题 Java 实现单词重量

华为OD机试真题Java实现DNA序列真题+解题思路+代码(2022&2023)

华为机试真题 Java 实现最小调整顺序次数2022.11 Q4 新题