洛谷P2014 選課 樹形dp

2021-09-27 07:18:31 字數 967 閱讀 4164

給出n

≤300

n\leq300

n≤30

0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m

≤300

m\leq300

m≤30

0個結點,求最大權值。

實際上這個是乙個森林,但是通過設定乙個權值為0

00的虛點0

00,把所有的沒有前驅的點全部連到這個結點上,並且這個結點是必須要選的,也就是選擇m+1

m+1m+

1個點。

f u,

if_

fu,i

​表示u

uu這個子樹選擇i

ii個結點的最大值。fu,

0=0,

fu,1

=w

uf_=0,f_=w_

fu,0​=

0,fu

,1​=

wu​。fu,

i=ma

xf_=max\+f_ \}

fu,i​=

max。

#includeusing namespace std;

typedef long long ll;

const int inf=0x3f3f3f3f;

const int n=3e2+7;

int f[n][n];

vectorgo[n];

int w[n],sz[n];

int n,m;

void dfs(int u,int fa)

} }}int main()

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

f[i][1]=w[i];

m++;

dfs(0,-1);

printf("%d\n",f[0][m]);

return 0;

}

洛谷P2014 選課(樹形DP)

傳送門 難度提高 省選 該題是一道經典的樹形dp題目,基本就是樹形dp的板子題。注意點的解釋參考 為什麼最後兩行要單獨拿出來做呢?for int i s x i 0 i f x i 1 f x i p x 我們回到題面上,父親是兒子的先修課,所以沒有父親時,兒子再多也沒有用,揹包中處理的子樹是不帶根...

洛谷P2014 選課 樹形dp

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

樹形DP 洛谷P2014 選課

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