洛谷 P2014 選課(樹形揹包)

2022-05-20 23:14:21 字數 856 閱讀 1189

題面:洛谷 p2014

如題這種有依賴性的任務可以用一棵樹表示,因為乙個兒子要訪問到就必須先訪問到父親。然後,本來本題所有樹是森林(沒有共同祖先),但是題中的節點\(0\)其實就可以當做乙個lca,從節點\(0\)開始dp。

狀態定義:\(dp[x][m]\)x節點,選則m課,獲得的最大學分

決策時,模擬揹包,遍歷每乙個狀態,用兒子的狀態更新

dp轉移方程(已優化一維):

\[dp[x][i] = max

\]這裡需要注意的是,你定義的dp狀態,是當前節點共選\(m\)課,而節點\(0\)是必須要選到的,所以應該乙個選取\(m+1\)個課程,並且最終狀態不是\(dp[0][m]\)而是\(dp[0][m+1]\)(卡了我好久……,所以定義dp狀態時一定要自己清楚所代表的含義)

此題非常像洛谷 p1273 有線電視網,都是樹形dp

#include #include #define maxn 303

#define inf 0x3fffffff

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

int n,m,dp[maxn][maxn];

vector mp[maxn];

int dfs(int x)

return cnt;

}int main()

dfs(0);

printf("%d", dp[0][m+1]);

return 0;

}

洛谷P2014 選課 樹形DP 揹包

有nn 門功課,一些功課有先修課。每門功課都有學分。求選出m m門功課能獲得的最大學分。樹形dp 揹包。很明顯,這道題肯定是設f u j f u j 表示以u u為根的子樹選出j j門課程學習能獲得的最大學分。那麼對於u u的任意一棵子樹v v,我們設它有s s個結點,那麼我們就可以在這棵子樹中選擇...

P2014 選課(樹形揹包)

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

洛谷P2014 選課 樹形dp

給出n 300 n leq300 n 30 0個結點,每個結點都有乙個權值,然後一些結點必須只有選了前驅結點這個結點才可以被選。現在最多選m 300 m leq300 m 30 0個結點,求最大權值。實際上這個是乙個森林,但是通過設定乙個權值為0 00的虛點0 00,把所有的沒有前驅的點全部連到這個...