首页 > 编程语言 >小美的树上染色(美团2024届秋招笔试第一场编程真题)

小美的树上染色(美团2024届秋招笔试第一场编程真题)

时间:2024-04-02 17:36:06浏览次数:16  
标签:nxt 真题 int 染色 美团 届秋招 res 节点 dp

题面

核心思想

树形DP
dp[1]表示以当前节点为根节点所包含的子树 且 当前节点能染色的最大染色数量
dp[0]表示以当前节点为根节点所包含的子树 且 当前节点不染色的最大染色数量
详情看注释~

代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        final long MOD = (long) (1e9 + 7);
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();
        long[] value = new long[n + 1];
        List<Integer>[] next = new List[n + 1];
        //存放value
        for(int i = 1; i <= n; i++){
            value[i] = scanner.nextInt();
            next[i] = new ArrayList<>();
        }
        //建树
        for(int i = 1; i < n; i++){
            int x = scanner.nextInt();
            int y = scanner.nextInt();
            next[x].add(y);
            next[y].add(x);
        }
        int[] res = dpOnTheTree(1, -1, value, next);
        System.out.println(Math.max(res[0], res[1]));
    }

    //dp[0] 表示当前节点为根  当前节点不染色的最大染色数量 dp[1]则表示当前节点染色的最大染色数量
    static int[] dpOnTheTree(int cur, int pre, long[] value, List<Integer>[] next){
        int[] dp = new int[2];
        //存放孩子节点的dp结果
        HashMap<Integer, int[]> res = new HashMap<>();

        //当前节点的dp结果分步做
        //dp[0]
        for(int nxt: next[cur]){
            if(nxt == pre)
                continue;
            int[] child = dpOnTheTree(nxt, cur, value, next);
            res.put(nxt, child);

            // 当前节点不染色 那就是所有孩子节点的最大值和
            dp[0] += Math.max(child[0], child[1]);
        }

        //dp[1]
        for(int nxt: next[cur]){
            if(nxt == pre)
                continue;
            long mul = value[cur] * value[nxt];
            long sqrt = (long) Math.sqrt(mul);
            // 可以和孩子节点染色
            if(sqrt * sqrt == mul){
                // dp[0] 存放的是所有孩子节点染色或不然染色的最大值和
                // Math.max(res.get(nxt)[0], res.get(nxt)[1]) 取需要染色的孩子节点nxt的dp[1], dp[0]的最大值
                // 用当前节点的dp[0]减去就剩下了其他孩子的最大值和
                // 那么当前节点和孩子节点nxt染色 dp[1]就等于 1. nxt这个孩子节点的dp[0] + 2. 其他孩子节点的dp最大值的和
                dp[1] = Math.max(dp[1], dp[0] - Math.max(res.get(nxt)[0], res.get(nxt)[1]) + res.get(nxt)[0] + 2);
            }
        }
        return dp;
    }
}

标签:nxt,真题,int,染色,美团,届秋招,res,节点,dp
From: https://www.cnblogs.com/ganyq/p/18111114

相关文章

  • 美团天天神券外卖节红包天天领入口
    美团天天神券外卖节红包天天领入口1、关注「草柴」微信公众号,回复「外卖红包」获得美团外卖红包天天免费领入口;2、打开后,即可成功领取多个美团外卖红包优惠券;3、外卖红包成功领取后,开始点餐;4、选择可用的美团红包享受优惠;5、使用成功,完成支付,就可以享受优惠......
  • 小美的字符串匹配度(美团2024届秋招笔试第一场编程真题)
    题面核心思想对于本来就匹配的肯定不能动用HashMap<Character,List>mp=newHashMap<>()存放当s[i]!=t[i]时字符t[i]的下标i,表示t[i]的这个字符出现在t的位置通过list去遍历s[i]在t中的位置,交换后对结果的贡献+1或+2代码importjava.util.*;publicclassMai......
  • 小美的外卖订单(美团2024届秋招笔试第一场编程真题)
    题面核心思想折扣价不能大于原价原价才能参与满家原价、折扣价和满减的价格都必须是正实数格式化输出代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scanner......
  • 判断ip地址是否合法(美团2024届秋招笔试第三场编程真题)
    核心思想大模拟-。-,还是不够细心,面向样例编程,一路错过去的。写得太丑了凑合看吧。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scannerscanner=newScanner(Syste......
  • 小美的游戏(美团2024届秋招笔试第三场编程真题)
    核心思想贪心,每次选最大的两个~代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)(1e9+7);Scannerscanner=newScanner(System.in);intn=scanner.nextInt();......
  • 小美种果树(美团2024届秋招笔试第三场编程真题)
    核心思想第一天施肥浇水第二天浇水第三天浇水定义以上操作为一轮先计算能够操作多少轮,那么剩下的只能在一轮中完成,剩下的成长值模拟下就好。代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){finallongMOD=(long)......
  • 小红结账(美团2024届秋招笔试第三场编程真题)
    核心思想模拟就完了代码importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intn=scanner.nextInt();intm=scanner.nextInt();Long[]res=newL......
  • 蓝桥杯真题代码记录(松散子序列
    目录1.题目:2.我的代码:小结:1.题目:给定一个仅含小写字母的字符串s,假设s的一个子序列t的第i个字符对应了原字符串中的第pi个字符。我们定义s的一个松散子序列为:对于i>1总是有pi−pi−1≥2。设一个子序列的价值为其包含的每个字符的价值之和......
  • 【华为OD机试真题】A卷-优秀学员统计(JAVA)
    一、题目描述【华为OD机试真题】A卷-优秀学员统计(JAVA)题目描述:公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。请你实现......
  • 【华为OD机试真题】A卷-预定酒店(JAVA)
    一、题目描述【华为OD机试真题】A卷-预定酒店(JAVA)题目描述:放暑假了,小明决定到某旅游景点游玩,他在网上搜索到了各种价位的酒店(长度为n的数组A),他的心理价位是x元,请帮他筛选出k个最接近x元的酒店(n>=k>0),并由低到高打印酒店的价格二、输入输出输入描述:第一行:n,k,x......