特定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 ...