題面:洛谷 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,把所有的沒有前驅的點全部連到這個...