在大學裡每個學生,為了達到一定的學分,必須從很多課程裡選擇一些課程來學習,在課程裡有些課程必須在某些課程之前學習,如高等數學總是在其它課程之前學習。現在有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 的解法。首先看題目,前面一大堆看似是廢話,其實還是有很大用處的。問題描述中提到了樹的中心,但後面卻貌似沒有用到,其實中心是給我們帶來提示的。...