POJ 1947 樹形DP入門題

2021-06-23 01:48:49 字數 774 閱讀 8653

給出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獲得冠軍

特定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 揹包問題

cpp0.cpp created on 2014年7月8日 author miao include include include include using namespace std vectorv 155 int dp 155 155 int n,p const int inf 0xfffff...