簡單樹型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;}