- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
本节内容属于算法提高知识,由专属金牌选手录制,由于视频时长有限,所以视频中例题讲解主要以C++为主讲解,大家可正常学习。算法思维是共通的,例题的其他语言解题代码,我们也在下方提供了,大家可以参考哦~
路径相关树形DP1
C++
#includebits/stdc++.h
usingnamespacestd;
usingLL=longlong;
constintN=2005;
vectorinte[N],t;
structasdf{
vectorintvec;
LLval;
};
vectorasdfw[N];
LLdp[N];
intn,m,k,dep[N]={1},f[N];
voiddfs(intu)
{
for(autov:e[u])
{
dfs(v);
dp[u]+=dp[v];
}
for(autot:w[u])
{
LLsum=dp[u];
for(autonw:t.vec)
{
sum-=dp[nw];
for(autov:e[nw])sum+=dp[v];
}
dp[u]=max(dp[u],sum+t.val);
}
}
intmain()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cinnm;
for(inti=2;i=n;++i)
{
cinf[i];
e[f[i]].push_back(i);
dep[i]=dep[f[i]]+1;
}
for(inti=1,x,y;i=m;++i)
{
LLval;
cinxyval;
t.clear();
while(x!=y)
if(dep[x]dep[y])t.push_back(x),x=f[x];
elset.push_back(y),y=f[y];
t.push_back(x);
w[x].push_back({t,val});
}
dfs(1);
coutdp[1];
return0;
}
Java
importjava.util.*;
publicclassMain{
staticfinalintN=2005;
staticArrayListInteger[]e=newArrayList[N];
staticArrayListASDF[]w=newArrayList[N];
staticlong[]dp=newlong[N];
staticintn,m,k;
staticint[]dep=newint[N];
staticint[]f=newint[N];
staticArrayListIntegert=newArrayList();
staticclassASDF{
ArrayListIntegervec=newArrayList();
longval;
}
staticvoiddfs(intu){
for(intv:e[u]){
dfs(v);
dp[u]+=dp[v];
}
for(ASDFt:w[u]){
longsum=dp[u];
for(intnw:t.vec){
sum-=dp[nw];
for(intv:e[nw])sum+=dp[v];
}
dp[u]=Math.max(dp[u],sum+t.val);
}
}
publicstaticvoidmain(String[]args){
文档评论(0)