首页 > TAG信息列表 > treedp
洛谷-P1352没有上司的舞会
基本思路 树形dp入门题,0表示不选中1表示选中。 \[ \begin{array}{l} treedp[u][0]=max(treedp[u.boss][0],treedp[u.boss][1])\\ treedp[u][1]=treedp[u.boss][0]+arr[u]; \end{array} \] #include<bits/stdc++.h> using namespace std; vector<int>boss[7000]; int arr[7000]codeforces494C Helping People【treedp+概率dp】
区间不交叉,可以看出区间构成了树形结构,建出树之后,设f[u][i]为u这个区间最大值最多加i的概率,转移是\( f[u][i]=p[u]*\prod f[v][mxu-mxv-1]+(1-p[u])*\prod f[v][mxu-mxv] \) 注意要理性选择建树方式,扫描就行了,不要瞎二分调一年…… #include<iostream> #include<cstdio> #include<vCF1119F Niyaz and Small Degrees【treedp+堆】
如果枚举d来dp,那么就是设f[u][0/1]为u点不断/断掉和父亲的边,然后优先选取f[v][1]+w(u,v)<=f[v][0]的,如果断掉这些度数还是多就用一个堆维护剩下的按f[v][1]+w(u,v)-f[v][0]从大到小取(负的) 然后注意到设当前要求度数是d,那么度数<=d的点全都不用dp,所以可以直接把贡献累加到和他相邻的