选课(树形DP)

选课

思路

哈,又是一道树形DP
貌似也挺水的。。。
先引进一个根节点把这些关系连成一棵树
然后枚举两边更新DP就好了
水题啊水题

题解

#include
#include
#include
#include
#include
using namespace std;

#define FOR(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;++i)
#define DOR(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;--i)
#define INF 0x3f3f3f3f
#define LL long long
#define M 305

inline void chkmi(int &a,int b) {if(a>b)a=b;}
inline void chkmx(int &a,int b) {if(ainline int MAX(int a,int b) {return a>b?a:b;}
inline int MIN(int a,int b) {return avector<int> es[M];
int val[M],dp[M][M];
int n,m,a;

void dfs(int s){
    dp[s][1]=val[s];
    FOR(i,0,es[s].size()-1){
        int t=es[s][i];
        dfs(t);
        DOR(j,m,1) FOR(k,1,m-j) chkmx(dp[s][j+k],dp[t][k]+dp[s][j]);
    }
}
int main(){
    cin>>n>>m;
    m++;
    FOR(i,1,n){
        scanf("%d%d",&a,&val[i]);
        es[a].push_back(i);
    }
    dfs(0);
    cout<0][m]<return 0;
}

你可能感兴趣的:(——树形DP,DP)