洛谷P2014 選課(樹形DP)

2021-10-02 14:42:14 字數 1124 閱讀 3920

傳送門

難度提高+/省選-

該題是一道經典的樹形dp題目,基本就是樹形dp的板子題。

注意點的解釋參考:

為什麼最後兩行要單獨拿出來做呢?

for(int i=s[x];i>=0;i–)

f[x][i+1]=f[x][i]+p[x];

我們回到題面上,父親是兒子的先修課,所以沒有父親時,兒子再多也沒有用,揹包中處理的子樹是不帶根結點的,我們要加上,否則會出現下面這種狀況:否則

如果在做的過程中將根結點算入子樹,那麼 f[1][2]最終值將會是 11 (在正確的過程中也是 11 ,但是會被更新到 f[1][3]),不做更新或再去做一遍更新就不對了,

#include

#include

#include

#include

using

namespace std;

const

int maxn =

305, maxm =

305;

int to[maxn]

, h[maxn]

, v[maxn]

, ne[maxn]

, idx;

int dp[maxn]

[maxm]

;int m, n;

int si, ki;

void

addedge

(int be,

int en)

void

dfs_dp

(int x)}}

for(

int i = m +

1; i >=1;

--i)

//填坑

dp[x]

[i]= dp[x]

[i -1]

+ v[x];}

intmain()

dfs_dp(0

);printf

("%d\n"

, dp[0]

[m +1]

);return0;

}

洛谷P2014 選課 樹形dp

給出n 300 n leq300 n 30 0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m 300 m leq300 m 30 0個結點,求最大權值。實際上這個是乙個森林,但是通過設定乙個權值為0 00的虛點0 00,把所有的沒有前驅的點全部連到這個...

洛谷P2014 選課 樹形dp

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...

樹形DP 洛谷P2014 選課

在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有n門功課,每門課有個學分,每門課有一門或沒有直接先修課 若課程a是課程b的先修課即只有學完了課程a,才能學習課程b 乙個學生要從這些課程裡選擇m門...