樹形dp ural1018蘋果二叉樹

2021-06-17 18:16:14 字數 832 閱讀 5868

#include#include#include#include#include#include#define maxn 200

#define inf 0xfffffff

using namespace std;

int dp[maxn][maxn];//dp[i][j]表示以i為根取j條樹枝的最大值

//1.只有乙個子樹

//dp[i][j]=max(dp[child][j-1]+val[i][child]);

//2.有兩個子樹

//dp[i][j]=max(dp[child1][k]+dp[child2][j-k-2]) 0<=k<=j-2;

//這裡採用記憶化搜尋,記錄所有可能的狀態,因為點還是比較少的。

//一般的樹形dp是先求出子樹的狀態,再根據子樹的狀態去得出根的狀態,這有明顯的層次結構的。

int n,m;

vectorg[maxn];//因為要判斷每棵樹的子樹個數,所以用vector比較好用

int map[maxn][maxn],vis[maxn];

void init()

memset(vis,0,sizeof(vis));

memset(dp,0,sizeof(dp));

memset(map,0,sizeof(dp));

}int dfs(int u,int q,int f)

if(dp[u][q]!=0) return dp[u][q];

//cout<>n>>m)

dfs(1,m,-1);

cout<}

return 0;

}

二叉蘋果樹 樹形DP

題意 description 有一棵蘋果樹,如果樹枝有分叉,一定是分2叉 就是說沒有只有1個兒子的結點 這棵樹共有n個結點 葉子點或者樹枝分叉點 編號為1 n,樹根編號一定是1。我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹 2 5 3 4 1 現在這顆樹枝條太多了...

樹形DP 二叉蘋果樹

有一棵二叉蘋果樹,如果樹枝有分叉,一定是分兩叉,即沒有只有乙個兒子的節點。這棵樹共 n 個節點,編號為 1 至 n,樹根編號一定為 1。我們用一根樹枝兩端連線的節點編號描述一根樹枝的位置。一棵蘋果樹的樹枝太多了,需要剪枝。但是一些樹枝上長有蘋果,給定需要保留的樹枝數量,求最多能留住多少蘋果。這裡的保...

二叉蘋果樹(樹形DP)

原題 顯然我們考慮這道題目可以很蠢的寫乙個dp對吧。考慮 dp i,j 表示以i為根,保留j個節點的最大蘋果數。然後就可以樹形dp的寫了。include include include include include include include define ll long long defin...