題解 Luogu p2014 選課 樹型dp

2021-08-21 21:19:40 字數 1069 閱讀 9891

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

輸入格式:

第一行有兩個整數n,m用空格隔開。(1<=n<=300,1<=m<=300)

接下來的n行,第i+1行包含兩個整數ki和si, ki表示第i門課的直接先修課,si表示第i門課的學分。若ki=0表示沒有直接先修課(1<=ki<=n, 1<=si<=20)。

輸出格式:

只有一行,選m門課程的最大得分。

輸入樣例#1: 複製

7  4

2 2

0 1

0 4

2 1

7 1

7 6

2 2

輸出樣例#1: 複製

13
樹型dp

注意 不能取k=j,因為至少有一門是必須留給先修課(父節點)

#include#include#include#include#include#include#include#define re register int

using namespace std;

inline int read()

const int maxn=410;

int n,m;

vectore[maxn];

int w[maxn],f[maxn][maxn];

inline void add_edge(int s,int f)

void dp(int x){

for(re i=1;i<=m;++i) f[x][i]=w[x];

for(re i=0;i​

luogu P2014 選課 樹形揹包

選課啊,好厲害的一道題,記得當年是瑣大神給我講的呢。樹形揹包 廢話 並不想再抄題幹 用dfs式的樹形dp更新,能過的原因是這題資料範圍是在是太小了。只有500 如果說要注意的地方的話,就是dfs裡的迴圈是逆序的,原因同揹包,從子樹j中,不可能重複選。其實dp i k 是省去了一維的即從i的前j棵子樹...

題解 P2014 選課(樹形DP 拓撲)

題意 現在有n門功課,每門課有一定的價值,但是課程可能需要一門先修課,問選m門課程能獲得的最大價值。分析 剛剛開始我以為這道題可能會出現環的情況 如 haoi 2010軟體安裝,但是又不會tarjan,本欲放棄,但是忽然眼角餘光瞟到討論班裡有人說這道題沒有環 好吧,這樣就比較easy了。首先我們要用...

題解 Luogu P1099 樹網的核

這題資料是真的水啊。昨天模擬賽考了這題,很多人都是 o n 3 水過,但我認為,要做就做的足夠好 其實是我根本沒想到 o n 3 的做法 然後就開始想 o n 的解法。首先看題目,前面一大堆看似是廢話,其實還是有很大用處的。問題描述中提到了樹的中心,但後面卻貌似沒有用到,其實中心是給我們帶來提示的。...