题目链接:http://poj.org/problem?id=1192
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 2585 | Accepted: 1381 |
Description
Input
Output
Sample Input
5 0 0 -2 0 1 1 1 0 1 0 -1 1 -1 0 1
Sample Output
2中文题就不需要说题意了吧。
思路:就是树形DP的入门题,注意存边时要存双向,因为是无向图。 根的话随便找一个就可以,不影响结果。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define N 1010 struct Edge { int v,next; }edge[N<<1]; struct Node { int x,y,v; }node[N]; int dp[2][N]; int head[N],flag[N],cnt; int dis(Node a,Node b) {return abs(a.x-b.x)+abs(a.y-b.y);} void addedge(int s,int e) { edge[cnt].v=e; edge[cnt].next=head[s]; head[s]=cnt++; } void dfs(int node) { flag[node]=1; for(int i=head[node];i!=-1;i=edge[i].next) { int v=edge[i].v; if(flag[v]) return; dfs(v); dp[1][node]=max(dp[1][node],dp[1][node]+dp[1][v]); dp[0][node]=max(dp[0][node],dp[1][v]); } } int main() { int n; while(~scanf("%d",&n)) { cnt=0; memset(head,-1,sizeof(head)); memset(dp[0],0,sizeof(dp[0])); for(int i=1;i<=n;i++) { scanf("%d %d %d",&node[i].x,&node[i].y,&node[i].v); dp[1][i]=node[i].v; for(int k=1;k<i;k++) { if(dis(node[i],node[k])==1) { addedge(k,i); addedge(i,k); } } } memset(flag,0,sizeof(flag)); dfs(1); int maxn=-(1<<30); if(dp[1][1]>maxn) maxn=dp[1][1]; if(dp[0][1]>maxn) maxn=dp[0][1]; printf("%d\n",maxn); } return 0; }