每日一題 POJ 2486 樹形dp 樹上揹包

2021-10-19 10:00:22 字數 742 閱讀 5217

**並不難寫,關鍵是要想清楚。樹形dp的第乙個比較完整寫完的題,是比較經典的題,來紀念一下。

一開始沒想清楚是因為對揹包問題的滾動陣列優化的理解不夠,自然在樹上的問題也沒思考清楚。

同時因為每個case過後忘記清零,導致re了一發,以後需要注意。

dpr是回到該點,nr是不回到該點,轉移方程如**。

//ac** 耗時188ms

#include

#include

#define maxn 205

using

namespace std;

struct edge

edge[maxn]

;int head[maxn]

,ptr;

int val[maxn]

;int n,k;

void

add_edge

(int u,

int v)

void

add(

int u,

int v)

int dpr[

105]

[205

],dpnr[

105]

[205];

void

dfs(

int now,

int f)}}

void

solve()

intmain()

solve()

;}}

poj 2486 (樹形dp (好題))

最近做了些樹形dp的題目,感覺對這種將每棵子樹都當做乙個物品處理的樹形揹包題目理解還不夠深刻,果然這題就被破的很慘,但好在想了很長時間想清楚了,這題就是求從一顆帶點權樹的根節點出發,走過k條邊能獲得的最大權值。考慮某乙個節點u,肯定有一維狀態表示從該節點開始還可以走多少條邊,但最優決策有可能是從u的...

poj2486 Apple Tree 樹形dp揹包

題意 由n個結點組成的樹,每個結點有個點權,你從結點1出發,問最多走m步可以獲得點權和 重複走乙個結點只有第一次走過會 獲得點權值 的最大值。思路 設dp i j k 表示從i結點走j步 k 0表示回到i結點共j步,k 1表示j步之後不回到i節點 可獲得點權和的最大值。考慮當前的結點u,以及它的子結...

每日一題(11) poj1276

1.本來覺得很簡單,卻耗費了一天半的時間。本來做完1837之後感覺已經明白了怎麼做。但是事實彷彿並非如此。當然,這也有自己的一點執念。2.這幾天體會到,寫程式就像做數學題一樣,很忌諱一算就錯。程式也是,不能想起來覺得這樣這樣,但是寫起來沒有把握對。就像前兩天有個演講說的那樣,印度的程式很厲害,因為所...