POJ 1192 -最优连通子集 树形DP
2013-07-23 13:12
381 查看
dp[k]表示k点出发能圈进的最大权之和...更新时若其最大的权之和是正数则加到dp[father[k]]上去...
Program:
Program:
#include<iostream> #include<stack> #include<queue> #include<stdio.h> #include<algorithm> #include<string.h> #include<cmath> #define ll long long #define oo 1000000007 #define MAXN 1005 using namespace std; struct node { int x,y,c; }point[MAXN]; int dp[MAXN],t; vector<int> line[MAXN]; bool used[MAXN]; void dfs(int x) { int i,m=line[x].size(); vector<int> h; dp[x]=0; h.clear(); for (i=0;i<m;i++) if (!used[line[x][i]]) { used[line[x][i]]=true; h.push_back(line[x][i]); } m=h.size(); for (i=0;i<m;i++) { dfs(h[i]); if (dp[h[i]]>=0) dp[x]+=dp[h[i]]; } dp[x]+=point[x].c; t=max(t,dp[x]); return; } int main() { int i,j,n,ans; while (~scanf("%d",&n)) { for (i=1;i<=n;i++) { scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].c); line[i].clear(); } for (i=1;i<=n;i++) for (j=1;j<=n;j++) if (abs(point[i].x-point[j].x)+abs(point[i].y-point[j].y)==1) line[i].push_back(j); memset(used,false,sizeof(used)); ans=-oo; for (i=1;i<=n;i++) if (!used[i]) { t=-oo; used[i]=true; dfs(i); ans=max(t,ans); } printf("%d\n",ans); } return 0; }
相关文章推荐
- poj 1192 最优连通子集(树形dp)题目好难懂。。。
- POJ1192 最优连通子集(树形DP)
- POJ-1192 最优连通子集(树形DP入门+模板)
- POJ 1192 最优连通子集 最详细的题解 (无向树树形DP)
- POJ 1192 最优连通子集 (树形dp)
- poj 1192最优连通子集(简单树形dp)
- POJ - 1192 最优连通子集 (树形DP)
- POJ 1192 最优连通子集【树形DP】
- POJ1192最优连通子集(树状dp)
- POJ 1192 最优连通子集(树上DP)
- poj 1192 最优连通子集 树状dp
- poj 1192-最优连通子集解题报告
- POJ 1192 最优连通子集(树形DP)
- poj1192 最优连通子集--树形dp
- poj 1192 最优连通子集 树的孩子兄弟表示法+简单树型dp
- poj 1192 最优连通子集
- poj 1192 最优连通子集
- poj1192(记忆化搜索)最优连通子集
- POJ-1192 最优连通子集 动态规划
- POJ1192 树形DP 最优连通子集