HDU 4616 Game 樹形dp,兩遍dfs

2021-07-16 17:28:03 字數 1409 閱讀 3555

hdu 4616 game

題意:

給乙個n

個節點和n−

1條邊的樹。每個節點代表乙個房間,每個房間都放有乙個價值為正的禮物,有的房間有陷阱,有的房間沒陷阱,最多可以經過

c 個陷阱(第

c個陷阱時就應該停止),可以從任意的房間開始行走,每個房間只能走一次,求獲得的禮物的最大價值和?

資料範圍:n≤

5∗104

,1≤c

≤3分析:用d

p[u]

[i] 表示從

u 出發經過

i個陷阱可以獲得的最大價值,第一次df

s 記錄從

u 的子樹得到的結果,第二遍df

s得到從父親方向的到的結果,所以需要對每種dp

[u][

i]記錄最大和次大,以及取得最大時的id

[u] 。 兩遍d

fs,注意下細節就好了。

時間複雜度:o(

n∗c)

#include 

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int max_n = 50010;

int t, n, total, c;

ll value[max_n], dp[max_n][5][5];

int head[max_n], trap[max_n], id[max_n][5];

struct edge edge[max_n * 2];

void addedge (int u, int v)

void dfs_son(int u, int p)

else

if (son > dp[u][j + t][1]) }}

}void dfs_father(int u, int p)

else

if (father > dp[v][j + t][1])

}dfs_father(v, u);

}}int main()

}memset(head, -1, sizeof(head));

total = 0;

for (int i = 1; i < n; ++i)

dfs_son(0, -1);

dfs_father(0, -1);

ll ans = 0;

for (int i = 0; i < n; ++i)

printf("%lld\n", ans);

}return

0;}

HDU4616 樹形DP 三次深搜

這題和之前那個hdu2616有著奇妙的異曲同工之處。都是要求某個點能夠到達的最大權重的地方。但是,這題加了個限制,要求最多隻能夠踩到c個陷阱,一單無路可走或者命用光了,就地開始清算總共得分之和。於是首先考慮,c的大小只有4,那麼可以進行非常方便的狀態轉移,即將之前2616中的各個矩陣都加一維,設定為...

HDU 1520 簡單樹形dp

題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...

HDU 2196 樹形dp入門

鏈結 傳送門 題意 給你乙個n個節點的棵樹,然後給你和 第i臺電腦與第a臺電腦相連的花費 v 問你最長的線路是多長 求樹上任意節點所能達到的最遠點的距離 樹形dp 開個陣列 分別記錄這個點到子樹最遠節點的最長距離和次長距離和記錄到父節點上的最長距離這樣在樹上dp 1.求子樹最長和次長 dp u 0 ...