简单树型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;
}