穿越數據森林與網絡迷宮:樹與圖上動態規劃實戰指南

在 C++ 算法的浩瀚宇宙中,樹與圖就像是神秘的迷宮和茂密的森林,充滿了未知與挑戰。而動態規劃則是我們探索其中的神奇羅盤,幫助我們找到最優路徑。今天,就讓我們一起深入這片神秘領域,揭開樹與圖上動態規劃的神秘面紗!?

樹與圖上動態規劃的獨特魅力?

與線性動態規劃相比,樹與圖上的動態規劃更加復雜,因為它們的結構不再是簡單的線性,而是具有分支和循環。但正是這種復雜性,讓它們能夠解決更多現實世界中的問題,比如城市交通網絡的最優路線規劃、社交網絡中的信息傳播分析等。在樹與圖上使用動態規劃,就像是在錯綜復雜的迷宮中,通過標記一個個關鍵點(狀態),找到從起點到終點的最佳路徑(最優解)。?

樹結構上的動態規劃?

樹結構天然具有遞歸和層次的特性,這使得樹的動態規劃通常從葉子節點向根節點進行狀態轉移。我們以 “樹的最大路徑和” 問題為例來深入理解。?

問題描述?

給定一棵二叉樹,找到從樹中某個節點到其他節點的路徑中,節點值之和最大的路徑。路徑可以從任意節點開始,到任意節點結束。?

代碼示例?

#include <iostream>
#include <algorithm>
using namespace std;// 定義二叉樹節點結構
struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};int maxPathSum(TreeNode* root, int& maxSum) {if (root == nullptr) {return 0;}// 遞歸計算左子樹的最大貢獻值int leftMax = max(0, maxPathSum(root->left, maxSum));// 遞歸計算右子樹的最大貢獻值int rightMax = max(0, maxPathSum(root->right, maxSum));// 計算經過當前節點的路徑和int currentPathSum = root->val + leftMax + rightMax;// 更新全局最大路徑和maxSum = max(maxSum, currentPathSum);// 返回當前節點能為父節點提供的最大貢獻值return root->val + max(leftMax, rightMax);
}int maxPathSum(TreeNode* root) {int maxSum = INT_MIN;maxPathSum(root, maxSum);return maxSum;
}

代碼解釋?

  1. 首先定義了二叉樹節點的結構體 TreeNode ,包含節點值 val 以及左右子節點指針 left 和 right 。?
  1. maxPathSum(TreeNode* root, int& maxSum) 函數用于遞歸計算以 root 為根節點的子樹的最大路徑和。它有兩個返回值相關的操作:?
  • 函數內部計算當前節點能為父節點提供的最大貢獻值。這是通過比較左子樹和右子樹的最大貢獻值(如果為負數則取 0,因為負數不會增加路徑和的大小),再加上當前節點的值得到的。比如,leftMax = max(0, maxPathSum(root->left, maxSum)); 就是計算左子樹的最大貢獻值。?
  • 同時,計算經過當前節點的路徑和,即當前節點值加上左子樹和右子樹的最大貢獻值,如 int currentPathSum = root->val + leftMax + rightMax; ,并更新全局最大路徑和 maxSum 。?
  1. 外層的 maxPathSum(TreeNode* root) 函數初始化全局最大路徑和為最小值 INT_MIN ,然后調用內部遞歸函數計算并返回最終的最大路徑和。?

圖結構上的動態規劃?

圖的動態規劃通常需要處理節點之間復雜的連接關系,常見的有拓撲排序結合動態規劃來解決有向無環圖的問題,或者使用記憶化搜索處理一般圖。我們以 “有向無環圖的最長路徑” 問題為例。?

問題描述?

給定一個有向無環圖(DAG),圖中節點帶有權值,找到從某個起點到其他節點的最長路徑長度。?

代碼示例?

#include <iostream>
#include <vector>
#include <queue>
using namespace std;// 拓撲排序 + 動態規劃求有向無環圖的最長路徑
int longestPathInDAG(vector<vector<pair<int, int>>>& graph, int start) {int n = graph.size();vector<int> indegree(n, 0);  // 入度數組vector<int> dp(n, 0);  // dp[i]表示從起點到節點i的最長路徑長度queue<int> q;// 統計每個節點的入度for (int i = 0; i < n; ++i) {for (auto& edge : graph[i]) {indegree[edge.first]++;}}// 將入度為0的節點入隊for (int i = 0; i < n; ++i) {if (indegree[i] == 0) {q.push(i);}}while (!q.empty()) {int node = q.front();q.pop();for (auto& edge : graph[node]) {int nextNode = edge.first;int weight = edge.second;// 更新到下一個節點的最長路徑長度dp[nextNode] = max(dp[nextNode], dp[node] + weight);indegree[nextNode]--;if (indegree[nextNode] == 0) {q.push(nextNode);}}}int maxPath = 0;for (int i = 0; i < n; ++i) {maxPath = max(maxPath, dp[i]);}return maxPath;
}

代碼解釋?

  1. 首先定義了圖的存儲結構 vector<vector<pair<int, int>>> ,其中 graph[i] 存儲了節點 i 所有的出邊,每個 pair 表示目標節點和邊的權值。?
  1. 使用 indegree 數組統計每個節點的入度,dp 數組用于記錄從起點到每個節點的最長路徑長度。?
  1. 通過拓撲排序將入度為 0 的節點入隊,然后不斷從隊列中取出節點,更新其鄰接節點的最長路徑長度(如 dp[nextNode] = max(dp[nextNode], dp[node] + weight); ),并減少鄰接節點的入度。當鄰接節點入度變為 0 時,將其入隊。?
  1. 最后遍歷 dp 數組,找出最長路徑長度并返回。?

樹與圖上的動態規劃充滿了挑戰與樂趣,它們在數據結構和算法的世界中扮演著重要角色。通過不斷練習和思考,你會發現自己在這片神秘領域中越來越游刃有余。快去探索更多有趣的問題,用動態規劃解開它們的奧秘吧!?

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

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

相關文章

UDP / TCP 協議

目錄 一、前言&#xff1a; 數據封裝與分用&#xff1a; 二、網絡協議分層模型&#xff1a; 三、UDP / TCP 協議 UDP 協議&#xff1a; 1、UDP 協議段格式&#xff1a; 2、UDP 的特點&#xff1a; TCP 協議&#xff1a; 1、TCP 協議段格式&#xff1a; 2、TCP 協議的十…

Python 實現的運籌優化系統數學建模詳解(動態規劃模型)

相關代碼鏈接&#xff1a;https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在計算機科學與數學建模的廣闊領域中&#xff0c;算法如同精密的齒輪&#xff0c;推動著問題的解決與系統的運行。當面對復雜的優化問題時&…

langfuse本地安裝

目錄 安裝命令項目準備用openai測試 安裝命令 本地&#xff08;docker compose&#xff09;&#xff1a;使用 Docker Compose 在你的機器上于 5 分鐘內運行 Langfuse。 # 獲取最新的 Langfuse 倉庫副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 運行 …

每天學一個 Linux 命令(35):dos2unix

每天學一個 Linux 命令(35):dos2unix 命令簡介 dos2unix 是一個用于將 Windows/DOS 格式的文本文件轉換為 Unix/Linux 格式的實用工具。它主要處理行尾符的轉換(將 CRLF 轉換為 LF),同時也能處理編碼問題和字符集轉換。這個命令在跨平臺文件共享、代碼遷移和系統管理場…

第6章 Python 基本數據類型詳解(int, float, bool, str)細節補充

文章目錄 Python 基本數據類型深入解析(int, float, bool, str)一、整型(int)的底層機制二、浮點型(float)的陷阱與解決方案三、布爾型(bool)的底層本質四、字符串(str)的不可變性與優化五、類型間的隱式轉換與陷阱六、性能優化與工具總結:關鍵細節與最佳實踐Python…

19. LangChain安全與倫理:如何避免模型“幻覺“與數據泄露?

引言&#xff1a;當AI成為企業"數字員工"時的責任邊界 2025年某金融機構因AI客服泄露用戶信用卡信息被罰款2300萬美元。本文將基于LangChain的安全架構與Deepseek-R1的合規實踐&#xff0c;揭示如何構建既強大又安全的AI系統。 一、AI安全風險矩陣 1.1 2025年最新威…

Java快速上手之實驗六

1. 編寫ItemEventDemo.java&#xff0c;當選中或取消選中單選鈕、復選鈕和列表框時顯示所選的結果。 2&#xff0e;編寫GUIExample.java&#xff0c;當選中或取消選中單選鈕、復選鈕時在標簽中顯示相應結果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):閱讀與注釋單選框這個類型的按鈕 QRadioButton,及各種屬性驗證,

&#xff08;1&#xff09;按鈕間的互斥&#xff1a; &#xff08;2&#xff09;源碼來自于頭文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…

【算法滑動窗口】 將x減到0的最小操作數

將x減到0的最小操作數 個人總結的八步歸納AI的歸納**8步歸納法&#xff08;極簡直白版&#xff09;**1. 問題本質2. 問題特征3. 切入點4. 解決流程5. 每步目標與操作6. 注意事項7. 最終目標8. 整體總結 代碼對照&#xff08;逐行解析&#xff09;舉個栗子&#x1f330;**一句話…

RISC-V GPU架構研究進展:在深度學習推理場景的可行性驗證

一、新型算力架構的突圍戰 在英偉達CUDA生態主導的GPU市場中&#xff0c;RISC-V架構正以?開源基因?和?模塊化設計?開辟新賽道。當前主流GPU架構面臨兩大痛點&#xff1a; 指令集封閉性?&#xff1a;NVIDIA的SASS指令集與AMD的GCN/RDNA架構均采用私有指令編碼&#xff0c…

LVGL -滑動條

1 滑動條 LVGL 的滑動條(Slider)是一個非常有用的控件,允許用戶通過拖動滑塊或點擊滑條來選擇一個值。 1.1 基本定義 滑動條允許用戶在一個預定義的數值范圍內選擇一個特定的值。它通常由一個軌道(track)和一個滑塊(thumb)組成。用戶可以通過點擊或拖動滑塊來調整數值。…

ROS2學習筆記|Python實現訂閱消息并朗讀的詳細步驟

本教程將詳細介紹如何使用 ROS 2 實現一個節點訂閱另一個節點發布的消息&#xff0c;并將接收到的消息通過 espeakng 庫進行朗讀的完整流程。以下步驟假設你已經安裝好了 ROS 2 環境&#xff08;以 ROS 2 Humble 為例&#xff09;&#xff0c;并熟悉基本的 Linux 操作。 注意&…

WPF封裝常用的TCP、串口、Modbus、MQTT、Webapi、PLC通訊工具類

WPF封裝常用通訊工具類 下面我將為您封裝常用的TCP、串口、Modbus、MQTT、WebAPI和PLC通訊工具類,適用于WPF應用程序開發。 一、TCP通訊工具類 using System; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;public class TcpClientHelper : …

npm pnpm yarn 設置國內鏡像

國內鏡像 常用的國內鏡像&#xff1a; 淘寶鏡像 https://registry.npmmirror.com 騰訊云鏡像?? https://mirrors.cloud.tencent.com/npm/ 華為云鏡像?? https://repo.huaweicloud.com/repository/npm/ CNPM&#xff08;阿里系&#xff09; ?? https://r.cnpmjs.org/ 清華…

P4552 [Poetize6] IncDec Sequence 題解

P4552 [Poetize6] IncDec Sequence - 洛谷 差分貪心 根據題目&#xff1a;一段區間都加1或減1 &#xff0c; 可以想到差分 構建差分數組&#xff1a;sub 我們要讓除了sub[1] , 其他全是0 我們可以的操作是&#xff1a;l1 , r-1 or l-1 , r1 or 一個數1 / -1 所…

Power Query精通指南2:數據轉換——透視/逆透視/分組、橫向縱向合并數據、條件判斷、處理日期時間

文章目錄 七、常見數據轉換7.1 逆透視7.1.1 逆透視操作7.1.2 重建透視表&#xff0c;更新數據7.1.3 三種逆透視方式&#xff08;逆透視列等價于逆透視其他列&#xff09; 7.2 透視7.3 拆分列7.3.1 將列拆分為多列7.3.2 將列拆分為多行7.3.3 拆分到列后逆透視&#xff08;保留列…

使用線性表實現通訊錄管理

目錄 &#x1f680;前言&#x1f99c;任務目標&#x1f31f;順序表實現&#x1f40d;鏈表實現 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 本文介紹線性表的實驗&#xff0c;使用順序表和鏈表實現通訊錄管理&#xff0c;包含初始化、插入、刪除、查詢、輸出。 &a…

firewall docker 沖突問題解決(親測有效)

# 關閉iptables&#xff0c;使用firewall systemctl disable iptables # 禁用服務 systemctl stop iptables # 關閉服務 systemctl status iptables # 查看服務狀態 systemctl enable firewalld # 設置防火墻開機自啟動 systemctl start firewalld # 開啟服務 systemctl s…

[250428] Nginx 1.28.0 發布:性能優化、安全增強及新特性

目錄 Nginx 1.28.0 穩定版發布主要亮點包括&#xff1a;功能增強&#xff1a;安全性改進&#xff1a;其他&#xff1a; Nginx 1.28.0 穩定版發布 Nginx 官方于 4 月 24 日發布了最新的 1.28.0 穩定版本。此版本基于之前的 1.27.x 主線分支&#xff0c;整合了多項新功能、性能優…

昇騰的CANN是什么?跟英偉達CUDA的有什么聯系和區別?【淺談版】

昇騰的CANN&#xff08;Compute Architecture for Neural Networks&#xff09;是華為專門為AI場景設計的異構計算架構&#xff0c;類似于英偉達的CUDA&#xff0c;但它針對的是華為自家的昇騰AI處理器&#xff08;Ascend系列&#xff09;。簡單來說&#xff0c;CANN的作用是連…