二叉蘋果樹

2022-08-04 10:24:10 字數 802 閱讀 7604

有一棵二叉樹,每條樹枝上有乙個權值,求保留\(q\)個樹枝下能達到的最大權值。

我們考慮\(n\)較小,先把邊轉化為點,我們可以用\(f[i][j]\)表示以\(i\)為根的子樹中選\(j\)個節點的能達到的最大權值,那麼有三種情況:1、左子樹全部砍掉。2、右子樹全部砍掉。3、左子樹保留\(k\)個,右子樹保留\(j-k\)個節點,直接轉移即可。

#include using namespace std;

const int n=110;

int head[n],nxt[n<<1],to[n<<1],tot,w[n<<1];

void add_edge(int x,int y,int z)

int lc[n],rc[n],a[n];

void dfs(int u,int fa)

}int f[n][n];

int dp(int x,int s)

int read()

while(ch>='0'&&ch<='9')

return res*w;

}void write(int x)

if(x>9)write(x/10);

putchar(x%10+'0');

}void writeln(int x)

int main()

dfs(1,0);

// for(int i=1;i<=n;i++)

// printf("%d %d %d\n",lc[i],rc[i],a[i]);

writeln(dp(1,q+1));

}

二叉蘋果樹

我們可以把保留邊轉換成保留點 因為我個人對保留點熟 跟據樹的性質,乙個點有0or1個根。所以我們可以把邊上的蘋果數轉移到子節點上。根據題意可知這應是一道dp題 廢話 設f i j 為以i為根的樹上保留j個節點的最大權值和,又因為這是個二叉樹,所以我們不妨設左子樹要保留的節點數為k,那麼右子樹的需要保...

題解 二叉蘋果樹

question 題目大意 邊權版本樹形 dp 求保留 q 條邊,使得其邊權和最大。當然,必須聯通。要不就不是 dp 了 那考慮設計 dp i j 表示第 i 個節點,選擇 j 條邊的最佳方案。寫出方程為 dp i j max dp i j k dp v k e i dis 列舉 k 表示邊數。這有...

二叉蘋果樹 樹形DP

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