POJ 1947 簡單的樹型DP,但要考慮完全

2021-06-04 17:42:17 字數 538 閱讀 4214

題目的意思是說給出乙個n個節點的樹,問最少要剪枝多少才能得到點數為p的子樹...

我的做法是從葉子節點按top順序更新到根節點,用dp[k][i]來表示保留k點並對其子樹剪枝,去掉i個點所需的最少剪枝數...那麼一路做到根節點,答案應該是dp[head][n-p]..

但是...這樣會wa..因為沒有注意..題目之說是點數為p的子樹..並沒說要包括根節點..譬如說樣例輸入給的樹,若說保留1個點...答案應該是1..切出乙個葉子節點就可以了..為了解決這個問題..在dp更新新時加個判斷就可以了..          

if (dp[x][p-n+sum[x]]

program:

#include#include#include#include#include#includeusing namespace std;

int n,p,i,x,y,father[160],sum[160],dp[160][160],head,leaf[160],ans;

queuemyqueue;

int main()

if (dp[x][p]

POJ 1947 樹DP獲得冠軍

特定n點,n 1的關係。建立了一棵樹,問至少減去幾個邊緣節點可以被作為得到p樹。樹典型dp稱號 dp cur j 記錄cur節點,為了得到乙個j除去該子樹的節點的邊的最小數目 對當前樹的每個子樹進行計算 砍掉此子樹 dp cur j dp cur j 1 不砍掉 for l 0 l j l dp c...

題解 poj1947 樹形DP

題目鏈結 dp root j 以root為根節點的子樹,得到 j 個節點的子樹需要最少減掉的邊數,注意子樹中必須保留root節點。否則無法dp 那麼很明顯的邊界條件dp root 1 num 兒子的個數 因為要只剩乙個節點的子樹,那麼所有的孩子都減掉,這樣就為兒子的個數。那麼狀態轉移方程呢 dp r...

poj 1947 樹dp 揹包問題

看了很多題解都是直接一遍dfs就搞定的方法,但是我實在是沒看懂那個轉移方程。最後在茫茫部落格中終於發現了乙個有邏輯的方法,但是複雜度好像要高一些,但是還是把這個題過了。include include include using namespace std const int maxn 155 vec...