POJ-2152 树形dp

题意:给你一颗树,边上权值表示距离,一个点上可以建消防站,花费为val[i],一个节点要么建消防站,要么周围d[i]距离内必须有一个消防站,求最小花费。

想了好久没想到,看了一眼题解才恍然大悟。我真的是太菜了!
题解:设ans[u]为以u为根的这棵子树的答案,dp[u][v]表示u节点被v保护的答案,dis[v]表示u到v的距离。若v可以保护u,则
dp[u][v]=val[v]+∑min(dp[i][v]−val[v],ans[i]);//其中i是u的直接子节点
ans[u]=min{dp[u][i]};

代码

#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn=1010;
int dp[maxn][maxn],dis[maxn],val[maxn],d[maxn],ans[maxn];
struct node{
	int x;
	int w;
	node(int _x,int _w)
	{
		x=_x;
		w=_w;
	}
};
vectora[maxn];
int t,n;
void Dfs(int u,int fa)
{
	for(int j=0;j

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