poj 1947 樹dp 揹包問題

2022-08-12 11:54:11 字數 1041 閱讀 4579

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

#include#include

#include

using

namespace

std;

const

int maxn=155

;vector

g[maxn];

const

int inf=0x3f3f3f3f

;int dp[2

][maxn];

intf[maxn][maxn];

intres[maxn][maxn];

void dfs(int u,int

fa)

else

memset(dp,inf,

sizeof

(dp));

dp[0][0]=0

;

for (int i=1;i<=g[u].size();i++)}}

f[u][

0]=0

;

if (fa==-1) res[u][0]=0

;

else res[u][0]=1

;

for (int i=1;i<=150;i++) f[u][i]=dp[g[u].size()&1][i-1

];

for (int i=1;i<=150;i++) res[u][i]=f[u][i]+(fa!=-1

); }

}int

main()

dfs(

1,-1

);

int ans=inf;

for (int i=1;i<=n;i++) ans=min(ans,res[i][p]);

printf(

"%d\n

",ans);

return0;

}

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

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