POJ2152 树形DP

题意:这一题是陈启锋的论文中的一道题 题意是在一棵树上选取节点建立消防站 每个节点有一个代价 然后每个节点之间又有距离 距离大于每个节点承受上限的化就不能被看管 然后问题的看管所有节点最小代价是多少

解法:正确的姿势就是利用dfs进行dp 枚举每一个节点被看管的节点 然后得到的dp方式是当前节点被i节点看管的最少花费取决于每一颗 子树分别被全部看管的最佳花费或者是儿子节点也同样被i看管带来的花费

#include
#include
#include
using namespace std;
#define maxn 1111
#define INF 2147483647
#define min(a,b) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
struct edge{int v,w;}s;
vectore[maxn];
int n,cur,best[maxn],dp[maxn][maxn],dist[maxn][maxn],limit[maxn],cost[maxn];
void init(){
    for(int i=0;i<=n;++i)e[i].clear(),best[i]=INT_MAX;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j)
            dp[i][j]=INT_MAX;
}
void Dis(int u,int f,int dis){
    dist[cur][u]=dis;
    for(int i=0;i


你可能感兴趣的:(DP)