树形DP

来源:互联网 发布:西部世界解析 知乎 编辑:程序博客网 时间:2024/06/11 02:04

树形DP

【例题】
政府邀请了你在火车站开饭店,但不允许同时在两个相连接的火车站开。任意两个火车站有且只有一条路径,每个火车站最多有50个和它相连接的火车站。告诉你每个火车站的利润,问你可以获得的最大利润为多少。

例如下图是火车站网络:

这里写图片描述

最佳投资方案是在1,2,5,6这4个火车站开饭店可以获得利润为90

输入样例 Maximum profit.in
6
10
20
25
40
30
30
4 5
1 3
3 4
2 3
6 4
输出样例 Maximum profit.out
90

【分析】

这一题所运用的主要思想就是树形DP,我们可以将题目简化成一个很明显的条件:把整张图看成一棵树,那么每一个点的状态就是选与不选所得利益的max。那么我们就可以以编号1为根节点,通过DFS+DP来实现这一过程。

如下:

void dfs(int now) {    b[now]=true;    f[now][1] = v[now];    int len = adj[now].size();    for( int i=0; i<len; i++) if(b[adj[now][i]]==false)    {         int x = adj[now][i];         dfs(x);         f[now][0]+=max(f[x][1],f[x][0]);         f[now][1]+=f[x][0];    }    return ;}

通常树形DP题都是这样做,难就难在状态转移上。

0 0
原创粉丝点击