poj1192 最优连通子集(树形dp)
题目链接:poj1192 最优连通子集
求一棵无向树的最大子树和。。类似于求最大子段和的办法,树形dp。
dp[i][0]:以i为根,不包括 i 结点的子树最大权
dp[i][1]:以i为根,包括 i 结点的子树的最大权
dp[i][0] = max(dp[j][0] , dp[j][1]) (j 为 i 的儿子)
dp[i][1] += dp[j][1] (dp[j][1] > 0,j 为 i 的儿子)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define CLR(a,b) memset((a),(b),sizeof((a)))
using namespace std;
const int N = ;
const int inf = 0x3f3f3f3f;
int n, cnt;
int dp[N][];
int head[N];
bool vis[N];
struct edge{
int nex, to;
}e[N*N];
struct point{
int x, y, c;
}p[N];
void add(int u, int v){
e[cnt].to = v;
e[cnt].nex = head[u];
head[u] = cnt++;
}
void dfs(int u){
vis[u] = ;
dp[u][] = ; dp[u][] = p[u].c;
for(int i = head[u]; ~i; i = e[i].nex){
int v = e[i].to;
if(!vis[v]){
dfs(v);
dp[u][] = max(dp[u][], max(dp[v][], dp[v][]));
if(dp[v][] > )
dp[u][] += dp[v][];
}
}
}
int main(){
int i, j, ans;
scanf("%d", &n);
CLR(head, -); CLR(dp, ); CLR(vis, );
cnt = ;
for(i = ; i <= n; ++i){
scanf("%d%d%d", &p[i].x, &p[i].y, &p[i].c);
for(j = ; j < i; ++j){
if(abs(p[i].x - p[j].x) + abs(p[i].y - p[j].y) == ){
add(i, j); add(j, i);
}
}
}
dfs();
ans = max(dp[][], dp[][]);
printf("%d\n", ans);
return ;
}
poj1192 最优连通子集(树形dp)的更多相关文章
- POJ1192最优连通子串----树形dp
中文题面,目的很明显,把相邻的两个点看成是两个点之间有一条边,就能当成树形dp来做了. 用一遍dfs可以找出最大的子树权值和. #include<iostream> #include< ...
- poj 1192最优连通子集(简单树形dp)
题目链接:http://poj.org/problem?id=1192 #include<cstdio> #include<cstring> #include<iostr ...
- ACM/ICPC 之 树形DP(POJ1192)
将某点看做根状态,邻接点看做子状态,由子状态向根状态转移. POJ1192-最优连通子集 题解:将每一个点分成两个状态进行保存,因此可以构造一个数组dp[i][2]. dp[i][0]:不包括该点权值 ...
- 树形动态规划(树形DP)入门问题—初探 & 训练
树形DP入门 poj 2342 Anniversary party 先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...
- poj 1192(树形DP)
最优连通子集 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2589 Accepted: 1382 Descriptio ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)
<题目链接> 题目大意: 给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少. 解题分析: 删除一条边,使原连通图 ...
- hdu 4612 Warm up 双连通+树形dp思想
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total S ...
- 4.9 省选模拟赛 圆圈游戏 树形dp set优化建图
由于圆不存在相交的关系 所以包容关系形成了树的形态 其实是一个森林 不过加一个0点 就变成了树. 考虑对于每个圆都求出最近的包容它的点 即他的父亲.然后树形dp即可.暴力建图n^2. const in ...
随机推荐
- 获取图片中感兴趣区域的信息(Matlab实现)
内容提要 如果一幅图中只有一小部分图像你感兴趣(你想研究的部分),那么截图工具就可以了,但是如果你想知道这个区域在原图像中的坐标位置呢? 这可是截图工具所办不到的,前段时间我就需要这个功能,于是将其用 ...
- function 类型
一.函数的声明方式 1.普通的函数声明 function box(num1,num2){ return num1+num2; }alert(box(1,2)); 2.使用变量初始化函数 var box ...
- 实时显示内容(Thread+Handler)
class LocThread extends Thread{ @Override public void run() { while (true){ try { Thread.sleep(99); ...
- ajax异步处理时,如何在JS中获取从Servlet或者Action中session,request
ssh项目中,我需要登陆某个页面(如a.jsp),通过onblur()鼠标失去焦点后来触发js函数(函数是ajax请求)请求到相应的action,处理完成后将数据存放到session对象里面,然后在a ...
- 创建空列表遇到的问题-RF
正确的方法:使用Create List,后面为空即可
- textarea 多行文本保存数据到DB,取出后恢复换行
Steps: 1.保存到数据库之前把textarea中的换行字符转换为<br>. var dbStr = textareaStr.replace(/\n|\r\n/g,"< ...
- Jenkins入门系列之——01第一章 Jenkins是什么?
第一章 Jenkins是什么? Jenkins 是一个可扩展的持续集成引擎. 主要用于: l 持续.自动地构建/测试软件项目. l 监控一些定时执行的任务. Jenkins拥有的特性包括: l 易于安 ...
- CentOS更新软件
列出所有可更新的软件清单命令:yum check-update 安装所有更新软件命令:yum update 仅安装指定的软件命令:yum install <package_name> 仅更 ...
- 用andtoid studio获取天气数据并解析适配
1.申请拿到数据 可以用“聚合数据” 2.在android studio中导入需要的jar包 复制—>app—>libs—>粘贴—>右击—>Add As Library… ...
- android在全屏下第一次触摸屏幕没有触发事件
A.设置全屏的方法很多就不多说了,常见如下两种(记录用以备忘): 1.在Androidmanifest.xml文件中设定,如: <activity android:name="com. ...
