洛谷 P2458 [SDOI2006]保安站岗 (树形dp)

https://www.luogu.org/problemnew/show/P2458 

 

思路:

dp[x][0]表示选自己,dp[x][1] 表示选儿子,dp[x][2] 表示选父亲,dp方程:dp[x][0]+=min(dp[v][1],min(dp[v][2],dp[v][0]));dp[x][2]+=min(dp[v][0],dp[v][1]);dp[x][1]有一些特殊的地方因为自己不选儿子并不一定所有的儿子都选,所以我们要选一个最优的儿子选。可以记一个f[v][0]-f[v][1]的最小值,最后把这个加进去就行了。

代码:

#include
using namespace std;
#define ll long long
const int maxn=1510;
const int inf=0x3f3f3f3f;
vectore[maxn];
int c[maxn];
int dp[maxn][3];
int in[maxn];
void dfs(int x,int pre)
{
    dp[x][0]=c[x];
    for(int i=0;i

 

你可能感兴趣的:(树形dp)