树型dp poj1192


简单树型dp。

题目好罗嗦。。一棵树找最大权值和子树 可以是中间子树 。算出最大权值


dfs 一下 搞掂!!

麦当劳最爱板烧哈哈哈 ~


#include <iostream>
#include <string.h>
#include <vector>
#include <cstdlib>  //abs() 自己写宏好容易写错  要加好多好多括号- -外面一个大括号没加 wa到死
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;

const int MAXN=1010;
bool v[MAXN];
int dp[MAXN][2],N;
vector<int> node[MAXN];

struct point
{
	int x,y,w;
}pp[MAXN];

void dfs(int rt)
{
	v[rt]=1;
	int i,j;
	int sz=node[rt].size();
	dp[rt][0]=0;   //rt自己不算上
	dp[rt][1]=pp[rt].w; //rt自己算上 
	for (i = 0; i < sz; i++) {
		j=node[rt][i];
		if(v[j])
		  continue;
		dfs(j);
		dp[rt][0]=Max(dp[rt][0],Max(dp[j][0],dp[j][1])); //找一个权值最大子树
		dp[rt][1]=Max(dp[rt][1],dp[rt][1]+dp[j][1]); //加上自己的权值 就算没有加上子树的 也要有这个值 因为双亲会用到
 }
}

void judge(int a,int b)
{
	int dis=(abs(pp[a].x-pp[b].x)+abs(pp[a].y-pp[b].y));
	if(dis==1)
	{
		node[a].push_back(b);
		node[b].push_back(a);
	}
	return;
}

int main(void)
{
	while(cin>>N)
	{
		memset(v,0,sizeof(v));
		int i,j,k;
		for (i = 0; i < N; i++) {
			cin>>pp[i].x>>pp[i].y>>pp[i].w;
			node[i].clear();
		}
		memset(dp,0,sizeof(dp));
		for (i = 0; i < N; i++) {
			for (j = i+1; j < N; j++) {
				judge(i,j);
			}
		
		}
	
		dfs(0);
		int ans=Max(dp[0][0],dp[0][1]);
		cout<<ans<<endl;		

	}
	return 0;
}


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