博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树型DP
阅读量:4877 次
发布时间:2019-06-11

本文共 1372 字,大约阅读时间需要 4 分钟。

树型DP不同于普通的的DP之处在于:通过递归找出儿子的信息,在回溯的过程中DP,计算结果(似乎很像记忆化搜索。。。。。。)然后处理相关信息,回答询问》》》》》》》经典应用:点分治中求重心,树链剖分中求重儿子,等等。。。。。。。。。

给大家几道水题》》》》

http://poj.org/problem?id=2342

http://oj.changjun.com.cn/problem/detail/pid/1976

http://oj.changjun.com.cn/problem/detail/pid/1634

http://oj.changjun.com.cn/problem/detail/pid/2171

第一题原码

#include
#include
#include
#include
#include
#define MAXX 6000#define INF -99999999using namespace std;struct data{ int nxt,to;}edge[MAXX*2+1];int dp[MAXX+1][2];//1选,0不选int head[MAXX+1],tot,ans,n;bool vis[MAXX+1];void add(int from,int too){edge[++tot].nxt=head[from];head[from]=tot;edge[tot].to=too;}void dfs(int num){ for(int i=head[num];i;i=edge[i].nxt){ int too=edge[i].to; dfs(too); dp[num][0]+=max(dp[too][0],dp[too][1]); dp[num][1]+=dp[too][0]; }}int main(){ /* freopen("1.in","r",stdin); freopen("1.out","w",stdout);*/ while(scanf("%d",&n)!=EOF){ memset(head,0,sizeof(head)); memset(vis,false,sizeof(vis)); for(int i=1;i<=n;++i)dp[i][0]=0; tot=0; for(int i=1;i<=n;++i)scanf("%d",&dp[i][1]); int a,b;while(scanf("%d%d",&a,&b)&&a!=0&&b!=0)add(b,a),vis[a]=true; for(int i=1;i<=n;++i)if(!vis[i]){dfs(i),printf("%d\n",max(dp[i][0],dp[i][1]));break;} } return 0;}

转载于:https://www.cnblogs.com/zzmmm/p/6501175.html

你可能感兴趣的文章
MATLAB消除曲线毛刺Outlier Detection and Removal [hampel]
查看>>
MySQL DATE_SUB() 函数
查看>>
在SSH框架下按条件分页查询
查看>>
jquery选择器
查看>>
【javascript学习——《javascript高级程序设计》笔记】DOM操作
查看>>
高效的SQL语句翻页代码
查看>>
NPAPI插件开发详细记录:用VS2010开发NPAPI插件步骤
查看>>
linux下Makefile全解(二)
查看>>
XMLHTTP.readyState的五种状态
查看>>
百度外卖 前端面试题
查看>>
record for json formate site
查看>>
查询树形的根节点
查看>>
HDU 1272 小希的迷宫
查看>>
hdu 5412 CRB and Queries(整体二分)
查看>>
CentOS如何安装linux桌面?
查看>>
Speech and Booth Demo in Maker Faire Shenzhen 2018
查看>>
bzoj 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
查看>>
bzoj 2281: [Sdoi2011]黑白棋
查看>>
bzoj 4475: [Jsoi2015]子集选取
查看>>
团队开发7
查看>>