codevs 1378 選課 (樹形dp)

2021-08-08 20:58:13 字數 1515 閱讀 8638

go to the problem

時間限制: 1 s

空間限制: 128000 kb

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n(n<300)門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。

在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能選修。例如《frontpage》必須在選修了《windows操作基礎》之後才能選修。我們稱《windows操作基礎》是《frontpage》的先修課。每門課的直接先修課最多只有一門。兩門課也可能存在相同的先修課。每門課都有乙個課號,依次為1,2,3,…。 例如:

【詳見】表中1是2的先修課,2是3、4的先修課。如果要選3,那麼1和2都一定已被選修過。   你的任務是為自己確定乙個選課方案,使得你能得到的學分最多,並且必須滿足先修課優先的原則。假定課程之間不存在時間上的衝突。

輸入檔案的第一行包括兩個整數n、m(中間用乙個空格隔開)其中1≤n≤300,1≤m≤n。

以下n行每行代表一門課。課號依次為1,2,…,n。每行有兩個數(用乙個空格隔開),第乙個數為這門課先修課的課號(若不存在先修課則該項為0),第二個數為這門課的學分。學分是不超過10的正整數。

輸出檔案只有乙個數,實際所選課程的學分總數。

7 4

2 2

0 1

0 4

2 1

7 1

7 6

2 2這個題粗略一看像是金明的預算方案,打完了才發現 ,**,這是要用鍊錶嗎? ?? ,沒錯,先修課可能會呈乙個鏈狀(學學學,一直學下去),感覺整個人都不好了。

怕麻煩的我直接去搜了題解,下面是整理,另,%%%loi_summer.

我們發現課程的關係可以變成乙個以0為根的樹。(他的爸爸就是他的先修課),為了方便處理,我們採用「左兒子右兄弟「的方法把多叉樹轉化為二叉樹。設當前狀態為u,v(u表示當前節點,v表示還可以選幾門課),如果當前狀態還沒有被更新,則分兩種情況處理:

1.選擇當前節點,從0~v-1列舉選了多少個左兒子並遞迴下去。

2.不選當前節點,全部選擇右兄弟裡的點。

**|ω・`)

#include

#include

#include

#include

#include

#include

using

namespace

std;

int n,m,fa;

int tree[310][3],w[310];

int dp[310][310];

int dfs(int u,int v)

int main() // 樹形dp

cout

<0][0],m);

return

0;}

codevs1378 選課 樹形DP

學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有些課程需要一定的基礎知識,必須在選了其它的一些課程的基礎上才能...

code vs 1378 選課(樹形DP)

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題解 檢視執行結果 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。...

codevs1378 選課 樹形dp

codevs1378 選課 題目描述 description 學校實行學分制。每門的必修課都有固定的學分,同時還必須獲得相應的選修課程學分。學校開設了n n 300 門的選修課程,每個學生可選課程的數量m是給定的。學生選修了這m門課並考核通過就能獲得相應的學分。在選修課程中,有些課程可以直接選修,有...