題解 二叉蘋果樹

2022-04-29 22:09:22 字數 739 閱讀 1517

\(question\)

題目大意:邊權版本樹形\(dp\),求保留\(q\)條邊,使得其邊權和最大。當然,必須聯通。(要不就不是\(dp\)了)

那考慮設計\(dp[i][j]\)表示第\(i\)個節點,選擇\(j\)條邊的最佳方案。

寫出方程為:

\[dp[i][j]=\max_dp[i][j-k]+dp[v][k]+e[i].dis

\]列舉\(k\)表示邊數。

這有乙個顯然問題:求出的不一定聯通啊。

於是我們把\(i->son[i]\)的一條邊單獨留出來,就有:

\[dp[i][j]=\max_dp[i][j-k-1]+dp[v][k]+e[i].dis

\]這題做完了。

#includeusing namespace std;

const int maxn=1000;

int n,q,tot,dp[maxn][maxn];

int head[maxn<<1],siz[maxn];

struct edgee[maxn<<1];

inline void add(int x,int y,int w)

void dfs(int x,int fa) }}

int main()

dfs(1,0);

int ans=-1;

printf("%d\n",dp[1][q]);

return 0;

}

二叉蘋果樹

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

二叉蘋果樹

有一棵二叉樹,每條樹枝上有乙個權值,求保留 q 個樹枝下能達到的最大權值。我們考慮 n 較小,先把邊轉化為點,我們可以用 f i j 表示以 i 為根的子樹中選 j 個節點的能達到的最大權值,那麼有三種情況 1 左子樹全部砍掉。2 右子樹全部砍掉。3 左子樹保留 k 個,右子樹保留 j k 個節點,...

題解 P2015 二叉蘋果樹

題目鏈結 mathcal 這題是我在某奧賽一本通 提高篇 樹形dp中的第一道例題,抱著試一試的心態,本蒟蒻嘗試了這道題。在過了n小時後,終於做出了這題 以上純屬扯淡 首先,我們仔細看一下題目,可以發現 這是一棵樹呀!所以,我們就需要用到樹上dp。那麼,我們應該怎麼設定狀態呢?上面這張醜陋的圖,紅色的...