力扣 第 125 場雙周賽 解題報告 | 珂學家 | 樹形DP + 組合數學


前言

image.png


整體評價

T4感覺有簡單的方法,無奈樹形DP一條路上走到黑了,這場還是有難度的。


T1. 超過閾值的最少操作數 I

思路: 模擬

class Solution {public int minOperations(int[] nums, int k) {return (int)Arrays.stream(nums).filter(x -> x < k).count();}
}

T2. 超過閾值的最少操作數 II

思路: 模擬

按題意模擬即可,需要注意int溢出問題就行。

class Solution {public int minOperations(int[] nums, int k) {PriorityQueue<Long> pq = new PriorityQueue<>();for (long num : nums) {pq.offer(num);}int ans = 0;while (pq.peek() < k) {long x = pq.poll(), y = pq.poll();pq.offer(Math.min(x, y) * 2 + Math.max(x, y));ans++;}return ans;}
}

T3. 在帶權樹網絡中統計可連接服務器對數目

思路: 枚舉 + dfs/bfs + 組合數學

因為樹的點數n( n ≤ 1000 n\le1000 n1000), 所以枚舉點,從該點進行dfs/bfs,然后對每個分支進行組合統計。

組合統計的核心

點 u 出發的各個分支滿足整除的數,組合序列為 c 0 , c 1 , c 2 , c 3 , . . . , c m 點u出發的各個分支滿足整除的數,組合序列為 c_0, c_1, c_2, c_3, ..., c_m u出發的各個分支滿足整除的數,組合序列為c0?,c1?,c2?,c3?,...,cm?

其 s = ∑ i = 0 i = m c i 其 s = \sum_{i=0}^{i=m} c_i s=i=0i=m?ci?

結果為 r e s [ u ] = ( ∑ i = 0 i = m c i ? ( s ? c i ) ) / 2 結果為 res[u] = (\sum_{i=0}^{i=m} c_i * (s - c_i)) / 2 結果為res[u]=(i=0i=m?ci??(s?ci?))/2

這樣時間復雜度為 O ( n 2 ) O(n^2) O(n2), 是可以接受的。

class Solution {List<int[]> []g;int signalSpeed;// fa是阻斷點int bfs(int u, int w, int fa) {int res = 0;boolean[] vis = new boolean[g.length];Deque<int[]> deq = new ArrayDeque<>();vis[u] = true;deq.offer(new int[] {u, w});if (w % signalSpeed == 0) {res ++;}while (!deq.isEmpty()) {int[] cur = deq.poll();int p = cur[0];int v = cur[1];for (int[] e: g[p]) {if (e[0] == fa) continue;if (vis[e[0]]) continue;if ((v + e[1]) % signalSpeed == 0) res++;deq.offer(new int[] {e[0], v + e[1]});vis[e[0]] = true;}}return res;}public int[] countPairsOfConnectableServers(int[][] edges, int signalSpeed) {int n = edges.length + 1;g = new List[n];Arrays.setAll(g, x->new ArrayList<>());this.signalSpeed = signalSpeed;for (int[] e: edges) {g[e[0]].add(new int[] {e[1], e[2]});g[e[1]].add(new int[] {e[0], e[2]});}int[] res = new int[n];for (int i = 0; i < n; i++) {int sum = 0;List<Integer> lists = new ArrayList<>();for (int[] e: g[i]) {int tmp = bfs(e[0], e[1], i);lists.add(tmp);sum += tmp;}int tot = 0;for (int j = 0; j < lists.size(); j++) {tot += lists.get(j) * (sum - lists.get(j));}res[i] = tot / 2;}return res;}}

如果該題把n變成 n ≤ 1 0 5 n\le10^5 n105, 那該如何解呢?

感覺換根 D P 可行,但是需要限制 s i g n a l S p e e d 范圍在 100 之內 , 這樣可控制在 O ( 1 0 7 ) 感覺換根DP可行,但是需要限制 signalSpeed 范圍在100之內, 這樣可控制在O(10^7) 感覺換根DP可行,但是需要限制signalSpeed范圍在100之內,這樣可控制在O(107)

如果signalSpeed很大,感覺沒轍啊。


T4. 最大節點價值之和

思路: 樹形DP

樹形DP的解法更加具有通用性,所以比賽就沿著這個思路寫。

如果操作不是異或,那這個思路就更有意義 如果操作不是異或,那這個思路就更有意義 如果操作不是異或,那這個思路就更有意義

對于任意點u, 其具備兩個狀態。

d p [ u ] [ 0 ] , d p [ u ] [ 1 ] , 表示參與和沒有參與異或下的以 u 為根節點的子樹最大和。 dp[u][0], dp[u][1], 表示參與和沒有參與異或下的以u為根節點的子樹最大和。 dp[u][0],dp[u][1],表示參與和沒有參與異或下的以u為根節點的子樹最大和。

那么其轉移方程,其體現在當前節點u和其子節點集合S( v ∈ u 的子節點 v\in u的子節點 vu的子節點)的迭代遞推轉移。

class Solution {int k;int[] nums;List<Integer>[]g;long[][] dp;void dfs(int u, int fa) {// 該節點沒參與, 該節點參與了long r0 = nums[u], r1 = Long.MIN_VALUE / 10;for (int v: g[u]) {if (v == fa) continue;dfs(v, u);long uRev0 = r0 + (nums[u]^k) - nums[u];long uRev1 = r1 - (nums[u]^k) + nums[u];long vRev0 = dp[v][0] + (nums[v]^k) - nums[v];long vRev1 = dp[v][1] - (nums[v]^k) + nums[v];long x0 = Math.max(r0 + Math.max(dp[v][0], dp[v][1]),Math.max(uRev1 + vRev1, uRev1 + vRev0));long x1 = Math.max(r1 + Math.max(dp[v][1], dp[v][0]),Math.max(uRev0 + vRev0, uRev0 + vRev1));r0 = x0;r1 = x1;}dp[u][0] = r0;dp[u][1] = r1;}public long maximumValueSum(int[] nums, int k, int[][] edges) {int n = nums.length;this.g = new List[n];this.nums = nums;this.k = k;this.dp = new long[n][2];Arrays.setAll(g, x -> new ArrayList<>());for (int[] e: edges) {g[e[0]].add(e[1]);g[e[1]].add(e[0]);}dfs(0, -1);return Math.max(dp[0][0], dp[0][1]);}
}
class Solution:def maximumValueSum(self, nums: List[int], k: int, edges: List[List[int]]) -> int:n = len(nums)g = [[] for _ in range(n)]for e in edges:g[e[0]].append(e[1])g[e[1]].append(e[0])dp = [[0] * 2 for _ in range(n)]def dfs(u, fa):r0, r1 = nums[u], -0x3f3f3f3f3ffor v in g[u]:if v == fa:continuedfs(v, u)uRev0 = r0 + (nums[u]^k) - nums[u];uRev1 = r1 - (nums[u]^k) + nums[u];vRev0 = dp[v][0] + (nums[v]^k) - nums[v];vRev1 = dp[v][1] - (nums[v]^k) + nums[v];t0 = max(r0 + max(dp[v][0], dp[v][1]), max(uRev1 + vRev0, uRev1 + vRev1))t1 = max(r1 + max(dp[v][0], dp[v][1]), max(uRev0 + vRev0, uRev0 + vRev1))r0, r1 = t0, t1dp[u][0], dp[u][1] = r0, r1dfs(0, -1)return max(dp[0][0], dp[0][1])

由于異或的特點,所以這題可以拋棄邊的束縛。

任意兩點 u , v ,可以簡單構造一條路徑,只有端點 ( u , v ) 出現 1 次,其他點都出現 2 次 任意兩點u,v,可以簡單構造一條路徑,只有端點(u,v)出現1次,其他點都出現2次 任意兩點u,v,可以簡單構造一條路徑,只有端點(u,v)出現1次,其他點都出現2

異或涉及邊的兩點,因此異或的點必然是偶數個,這是唯一的限制.

class Solution {public long maximumValueSum(int[] nums, int k, int[][] edges) {long sum = 0;PriorityQueue<Long> pq = new PriorityQueue<>(Comparator.comparing(x -> -x));for (int v: nums) {pq.offer((long)(v ^ k) - v);sum += v;}while (pq.size() >= 2) {long t1 = pq.poll();long t2 = pq.poll();if (t1 + t2 > 0) {sum += t1 + t2;} else {break;}}return sum;}
}
class Solution:def maximumValueSum(self, nums: List[int], k: int, edges: List[List[int]]) -> int:s = sum(nums)arr = [(v ^ k) - v for v in nums]arr.sort(key=lambda x: -x)n = len(nums)for i in range(0, n, 2):if i + 1 < n and arr[i] + arr[i + 1] > 0:s += arr[i] + arr[i + 1]return s

寫在最后

image.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

VM虛擬機無法傳輸文件(更新時間24/3/3)

出現這個問題一般是未安裝VMware Tools 以下為手動安裝教程及可能出現的問題的解決方法&#xff1a; 1. 準備安裝 2.用cmd手動啟動安裝 3. 安裝過程默認即可&#xff0c;直接一直下一步 4.安裝完成后會自動重啟虛擬機&#xff08;沒有的話手動重啟即可&#xff09; 5.重啟以后…

Web應用安全威脅與防護措施

本文已收錄至《全國計算機等級考試——信息 安全技術》專欄 由于極其容易出現漏洞、并引發安全事故&#xff0c;因此數據隱私的保護是目前絕大多數企業不可繞過的運維環節。不過&#xff0c;許多中小型企業往往會錯誤地認為只有大型企業才會成為黑客的目標。而實際統計數字卻截…

StarCoder2模型,釋放你的大模型編碼潛能

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

DeepSpeed-Chat RLHF 階段代碼解讀(0) —— 原始 PPO 代碼解讀

為了理解 DeepSpeed-Chat RLHF 的 RLHF 全部過程&#xff0c;這個系列會分三篇文章分別介紹&#xff1a; 原始 PPO 代碼解讀RLHF 獎勵函數代碼解讀RLHF PPO 代碼解讀 這是系列的第一篇文章&#xff0c;我們來一步一步的看 PPO 算法的代碼實現&#xff0c;對于 PPO 算法原理不太…

部署若依前后端分離項目,連接數據庫失敗

部署若依前后端分離項目&#xff0c;連接數據庫失敗&#xff0c;異常如下&#xff1a; 解決方案&#xff1a;application配置文件里&#xff0c;連接數據庫的參數useSSL的值改為false

leetcode 長度最小的子數組

在本題中&#xff0c;我們可以知道&#xff0c;是要求數組中組成和為target的最小子數組的長度。所以&#xff0c;我們肯定可以想到用兩層for循環進行遍歷&#xff0c;然后枚舉所有的結果進行挑選&#xff0c;但這樣時間復雜度過高。 我們可以采用滑動窗口&#xff0c;其實就是…

編寫dockerfile掛載卷、數據容器卷

編寫dockerfile掛載卷 編寫dockerfile文件 [rootwq docker-test-volume]# vim dockerfile1 [rootwq docker-test-volume]# cat dockerfile1 FROM centosVOLUME ["volume01","volume02"]CMD echo "------end------" CMD /bin/bash [rootwq dock…

2024 年廣東省職業院校技能大賽(高職組)“云計算應用”賽項樣題 2

#需要資源或有問題的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要資源或有問題的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要資源或有問題的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企業根據自身業務需求&#…

每日OJ題_牛客_合法括號序列判斷

目錄 合法括號序列判斷 解析代碼 合法括號序列判斷 合法括號序列判斷__牛客網 解析代碼 class Parenthesis {public:bool chkParenthesis(string A, int n){if (n & 1) // 如果n是奇數return false;stack<char> st;for (int i 0; i < n; i) {if (A[i] () {s…

筆記本hp6930p安裝Android-x86補記

在上一篇日記中&#xff08;筆記本hp6930p安裝Android-x86避坑日記-CSDN博客&#xff09;提到hp6930p安裝Android-x86-9.0&#xff0c;無法正常啟動&#xff0c;本文對此再做嘗試&#xff0c;原因是&#xff1a;Android-x86-9.0不支持無線網卡&#xff0c;需要在BIOS中關閉WLAN…

《Docker極簡教程》--Docker的高級特性--Docker Compose的使用

Docker Compose是一個用于定義和運行多容器Docker應用程序的工具。它允許開發人員通過簡單的YAML文件來定義應用程序的服務、網絡和卷等資源&#xff0c;并使用單個命令來啟動、停止和管理整個應用程序的容器。以下是關于Docker Compose的一些關鍵信息和優勢&#xff1a; 定義…

B082-SpringCloud-Eureka

目錄 微服務架構與springcloud架構演變為什么使用微服務微服務的通訊方式架構的選擇springcloud概述場景模擬之基礎架構的搭建模擬微服務之間的服務調用目前遠程調用的問題 eureka注冊中心的作用注冊中心的實現服務提供者注冊到注冊中心 springcloud基于springboot 微服務架構與…

10 計算機結構

馮諾依曼體系結構 馮諾依曼體系結構&#xff0c;也被稱為普林斯頓結構&#xff0c;是一種計算機架構&#xff0c;其核心特點包括將程序指令存儲和數據存儲合并在一起的存儲器結構&#xff0c;程序指令和數據的寬度相同&#xff0c;通常都是16位或32位 我們常見的計算機,筆記本…

在Centos7中用Docker部署gitlab-ce

一、介紹 GitLab Community Edition (GitLab CE) 是一個開源的版本控制系統和協作平臺&#xff0c;用于管理和追蹤軟件開發項目。它提供了一套完整的工具和功能&#xff0c;包括代碼托管、版本控制、問題跟蹤、持續集成、持續交付和協作功能&#xff0c;使團隊能夠更加高效地進…

動態規劃|【路徑問題】|931.下降路徑最小和

目錄 題目 題目解析 思路 1.狀態表示 2.狀態轉移方程 3.初始化 4.填表順序 5.返回值 代碼 題目 931. 下降路徑最小和 給你一個 n x n 的 方形 整數數組 matrix &#xff0c;請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的任何元素開…

【Vue3】Props的使用詳解

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

概率基礎——多元正態分布

概率基礎——多元正態分布 介紹 多元正態分布是統計學中一種重要的多維概率分布&#xff0c;描述了多個隨機變量的聯合分布。在多元正態分布中&#xff0c;每個隨機變量都服從正態分布&#xff0c;且不同隨機變量之間可能存在相關性。本文將以二元標準正態分布為例&#xff0…

多線程JUC 第2季 中斷線程

一 中斷線程 1.1 中斷概念 1.在java中&#xff0c;沒有提供一種立即停止一條線程。但卻給了停止線程的協商機制-中斷。 中斷是一種協商機制。中斷的過程完全需要程序員自己實現。也即&#xff0c;如果要中斷一個線程&#xff0c;你需要手動調用該線程的interrupt()方法&…

錄制用戶操作實現自動化任務

先上視頻&#xff01;&#xff01; 流程自動化工具-錄制操作繪制流程 這個想法之前就有了&#xff0c;趁著周末時間給它擼出來。 實現思路 從之前的文章自動化桌面未來展望中已經驗證了錄制繪制流程圖的可行性。基于DOM錄制頁面操作軌跡的思路監聽頁面點擊、輸入事件即可&…

無人機鏡頭穩定的原理和相關算法

無人機的鏡頭穩定主要基于兩個關鍵技術&#xff1a;鏡頭平衡技術和實時電子穩像。無人機鏡頭穩定的原理和相關算法主要是通過鏡頭平衡技術和實時電子穩像技術來保持攝像鏡頭的穩定性&#xff0c;從而拍攝出清晰、穩定的畫面。無人機鏡頭穩定的原理主要是通過傳感器和算法來實現…