(树形dp入门)

题目一:Anniversary party 

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520

题意:有n个客人,每个客人有一个开心值,然后客人K是客人L的主管,客人K和客人L不能一起被邀请参加party,问:邀请人的最大开心值是多少?

题解:显然这是道树形dp 的题,我们定义 dp[i][1]表示邀请客人i,dp[i][0]表示不邀请客人i,

故转移方程为:

dp[i][1]+=d[j][0] ,

dp[i][0]+=max(dp[j][1],dp[j][0])。

#include
#include
#include
#include

using namespace std;

const int maxn=6010;

int dp[maxn][2];
vector G[maxn];
int fa[maxn];

int dfs(int root)
{
    int len=G[root].size();
    for(int i=0;i

 

题目二:Strategic Game

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054

题意:给你一个n个节点的树,让你挑选出一些节点放士兵,使得所有边都能被士兵监视,让你尽可能的少放士兵。

题解:

显然这道题跟上一道类似,也可以用树形dp来解决,还是一样dp[i][1]表示挑选节点i放士兵,dp[i][0]表示不挑选节点i放士兵,

转移方程为:

dp[i][0]+=d[j][1] ,

dp[i][1]+=min(dp[j][1],dp[j][0])。

#include
#include
#include
#include

using namespace std;

const int maxn=1510;

int dp[maxn][2];
vector G[maxn];
int fa[maxn];

int dfs(int root)
{
//    printf("f");
    int len=G[root].size();
    for(int i=0;i

 

 

 

你可能感兴趣的:(DP)