POJ 1947 樹DP獲得冠軍

2021-09-07 01:38:00 字數 761 閱讀 9773

特定n點,n-1的關係。建立了一棵樹,問至少減去幾個邊緣節點可以被作為得到p樹。樹典型dp稱號

dp[cur][j] :記錄cur節點,為了得到乙個j除去該子樹的節點的邊的最小數目

對當前樹的每個子樹進行計算

砍掉此子樹:   dp[cur][j]=dp[cur][j]+1;

不砍掉:           for (l=0;l<=j;l++)  dp[cur][j]=min(dp[cur][j],dp[cur][l]+dp[next][j-l]); 列舉從該樹中留l個節點其它由新進子樹得到的方案的代價 dp[cur][l]+dp[next][j-l];

#include "stdio.h"

#include "vector"

#include "math.h"

#include "string.h"

int inf=0x3f3f3f3f;

using namespace std;

struct node

data[160];

int dp[160][160];

int p;

int min(int a,int b)

}}int main()

{ int n,a,b,i,root,ans;

while (scanf("%d%d",&n,&p)!=eof)

{memset(dp,inf,sizeof(dp));

memset(data,0,sizeof(data));

for (i=1;i

題解 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...

POJ 1947 樹形DP入門題

給出n個點,n 1個關係,建出樹形圖,問最少減去幾個邊能得到節點數為p的樹。典型樹形dp題 dp cur j 記錄cur結點,要得到一棵j個節點的子樹去掉的最少邊數 轉移方程用的揹包的思想 對當前樹的每乙個子樹進行計算 砍掉此子樹 dp cur j dp cur j 1 不砍掉 for l 0 l ...