選課 樹形dp 輸出方案

2022-05-19 06:14:41 字數 1753 閱讀 2632

《更新提示》

《第一次更新》這道題的樹上分組揹包的做法已經在『選課 有樹形依賴的揹包問題』中講過了,本篇部落格中主要講解將多叉樹轉二叉樹的做法,以便輸出方案。

《正文》

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

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

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

第一行包括兩個正整數n、m(中間用乙個空格隔開)其中n表示待選課程總數(1≤n≤500),m表示學生可以選的課程總數(1≤m≤n)。 以下m行每行代表一門課,課號依次為1,2,…,m。每行有兩個數(用乙個空格隔開),第乙個數為這門課的先修課的課號(若不存在先修課則該項為0),第二個數為這門課的學分。

第一行只有乙個數,即實際所選課程的學分總數。 以下n行每行有乙個數,表示學生所選課程的課號。

n行學生選課的課號按從小到大的順序輸出。

7 4

2 20 1

0 42 1

7 17 6

2 2

1323

67

直接使用樹上揹包的方法,不便於輸出方案,我們換一種思路\(dp\)。對於每乙個節點,我們記錄\(br[i]\)代表\(i\)乙個兄弟節點的編號,\(ch[i]\)代表\(i\)乙個子節點的編號。如果兄弟節點和子節點不止乙個怎麼辦,顯然,它兄弟的兄弟也是它的兄弟,它兒子的兄弟也是它的兒子,這樣就可以表示所有的兄弟節點和兒子節點了,而事實上,對於每乙個\(i\)我們只記錄乙個\(br[i]\)和\(ch[i]\),這樣,本質上我們就把多叉樹轉換為二叉樹了。

還是設\(f[x][t]\)代表以\(x\)為根的子樹中選了\(t\)門課的最大學分,顯然有兩種轉移:

\(1.\) 不取節點\(x\),直接令\(f[x][t]=f[br[x]][t]\)即可

\(2.\) 取節點\(x\)並在以\(x\)為根的子樹中取一部分點,剩下的一部分點在兄弟中取,即\(f[x][t]=max\\)

利用上述兩個方程即可完成樹形\(dp\)。

我們可以通過同樣的列舉方式得知每一次節點\(x\)是否被選,就能得到方案了。

\(code:\)

#includeusing namespace std;

const int n = 520;

int n,m,br[n],ch[n],a[n],f[n][n],ans[n];

inline void input(void)

}inline void dp(int x,int t)

{ if ( f[x][t] > 0 ) return;

if ( x == 0 || t == 0 ) return;

dp( br[x] , t );

f[x][t] = f[br[x]][t];

for (int i=0;i《後記》

選課(樹形DP)

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

樹形dp 選課

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

codevs1378 選課 樹形DP

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