日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态规划 —— 树形 DP

發(fā)布時間:2025/3/17 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划 —— 树形 DP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【概述】

樹形動態(tài)規(guī)劃是在樹的數(shù)據(jù)結(jié)構(gòu)上的動態(tài)規(guī)劃,在各個階段呈現(xiàn)樹狀關(guān)系的時候可以采用樹形 DP,其基本思想是由子節(jié)點的信息推出父節(jié)點的信息。

樹形 DP 中,是通過以下 4 點樹的特點來進行建圖的

  • ?n 個點,n-1 條邊的無向圖,任意兩頂點間可達
  • 無向圖中任意兩個點間有且只有一條路
  • 一個點至多有一個前趨,但可以有多個后繼
  • 無向圖中沒有環(huán)
  • 【計算順序】

    計算順序與線性動態(tài)規(guī)劃的順推、逆推相似,同樣有兩個方向:?

  • 葉 => 根:在回溯時,從葉節(jié)點向上轉(zhuǎn)移狀態(tài)
  • 根 => 葉:在葉向根 DFS 一遍后(預(yù)處理),再重新向下獲取答案
  • 【表示方法】

    樹形 DP 還涉及到建圖的問題,如果題目能很清晰的輸入一個樹,一般使用?vector<int> s[N],用 s[i] 來保存節(jié)點 i 的所有兒子。

    當(dāng)樹是一般樹且涉及到權(quán)值時,一般采用鏈式存儲法,即用結(jié)構(gòu)體數(shù)組 edge 存邊,edge[i] 表示第 i 條邊,head[i] 存以 i 為起點的第一條邊(在edge中的下標(biāo))

    struct Node{int next; //下一條邊的存儲下標(biāo)int to; //這條邊的終點int w; //權(quán)值 }edge[N*2]; //由于是無向圖,因此要開2倍

    常用的建圖方法如下

    for(int i=1;i<=n;i++){int x,y;scanf("%d%d",&x,&y);addEdge(x,i);w[i]=y; }

    若以點 i 為起點的邊新增了一條,則在 edge 中的下標(biāo)為 j,那么 edge[j].next=head[i],然后head[i]=j,即每次新加的邊作為第一條邊,最后倒序遍歷即可。

    int cnt;//邊的計數(shù) void Add(int x,int y,int w) { //起點x, 終點y, 權(quán)值wedge[cnt].x=x;edge[cnt].w=w;edge[cnt].next=head[x];head[y]=cnt++; }

    遍歷以 x 為起點的邊時,以 i 開始為第一條邊,每次指向下一條(以-1為結(jié)束標(biāo)志)

    memset(head,-1,sizeof(head)); for(int i=head[st]; i!=-1; i=edge[i].next){... }

    【計算方法】

    樹形 DP 的計算方法則與線性 DP 不同,線性 DP 一般采用傳統(tǒng)迭代,而樹是通過遞歸定義的,因此樹形 DP 要遞歸來求解。

    一般而言,樹形 DP 常與背包問題結(jié)合起來,常用 dp[node] 表示的是以 node 為根的子樹能得到的最優(yōu)解,dp[node] 需要從 node 的子結(jié)點進行狀態(tài)轉(zhuǎn)移,由于 dp[node] 的狀態(tài)是由它的兒子轉(zhuǎn)移而來,因此可以 node 的 n 個兒子看做 n 個物品,對這 n 個物品抉擇得到最優(yōu)的 dp[node] 就用到背包的思想。

    當(dāng)然,樹形 DP 不止 node 這一維,第二維一般都是以題目給出的限制需要來,然后根據(jù)題意保存好狀態(tài),寫出狀態(tài)轉(zhuǎn)移方程,遞歸的求解 DP[root]

    【基本步驟】

    1.若問題是一棵隱性樹(不以樹為直接背景,但各個階段呈樹狀關(guān)系),則需要將問題轉(zhuǎn)化為一棵顯性樹,并存儲各階段的樹狀聯(lián)系。

    2.根據(jù)題目要求與數(shù)據(jù)量,選擇合適的樹的存儲方式。

    若節(jié)點數(shù)小于5000,一般選用鄰接矩陣存儲;若節(jié)點數(shù)大于5000,一般選用鄰接表來存儲(邊要開到2*N,因為是無向圖);若是二叉樹或需要多叉轉(zhuǎn)二叉,則可以用兩個一維數(shù)組 brother[N]、child[N] 來存儲。

    3.寫出動歸方程

    通過孩子和父親之間的關(guān)系建立方程,根據(jù)要求選用 根 => 葉 或 葉 => 根 的計算方式。

    【題目類型】

    1.常規(guī)問題

  • 沒有上司的舞會(洛谷-P1352)(經(jīng)典題,入門必做):點擊這里
    英文版:Anniversary party(HDU-1520):點擊這里
  • Computer(HDU-2196)(經(jīng)典題,入門必做):點擊這里
  • 2.樹形背包問題

    求在樹上選一些點滿足價值最大的問題,一般可設(shè) dp[i][j] 表示 i 這顆子樹選 j 個點的最優(yōu)解。

  • 有線電視網(wǎng)(洛谷-P1273)(分組背包):點擊這里
    英文版:TELE(POJ-1115):點擊這里
  • Starship Troopers(HDU-1011)(分組背包,注意特判m=0的情況):點擊這里
  • Rebuilding Roads(POJ-1947)(分組背包):點擊這里
  • The more, The Better(HDU-1561)(01背包+虛擬根節(jié)點):點擊這里
  • 3.刪點或刪邊問題

    統(tǒng)計子樹和,通過加減一些子樹滿足題目中要求的某些性質(zhì)。

  • Garland(CF-767C)(點權(quán)固定,注意特判):點擊這里
  • 最大子樹和(洛谷-P1122)(根據(jù)具體權(quán)值大小來判斷):點擊這里
  • 重建道路(洛谷-P1272)(刪邊+01背包):點擊這里
  • 總結(jié)

    以上是生活随笔為你收集整理的动态规划 —— 树形 DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。