給出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...