zoukankan      html  css  js  c++  java
  • hdu 4705 Y (树形dp)

    Description

    Input

    4
    1 2
    1 3
    1 4

    题目的意思是给你一棵树,让你找到所有不在一条路径上的三个点的情况个数。
    乍一看正向处理比较麻烦,我们从反方向考虑,如果是取在一条路径上的3个点,那又该怎样取呢?我们以Num[rt]表示以rt为根的子树上的节点的个数(包括根节点)。
    选取方法是这样的,先把一个树的树根选上,然后看他每一个亲儿子作为树根时,子树有几个节点(Num[son1],Num[son2],Num[son3]...)对于son1来说,能选取Num[son1]中的任意一点,再加上rt,现在选了两个点
    现在寻找第三个点,第三个点是剩下的所有节点随意取一个。及Num[son1]*(n-Num[son1]-1)。当我们算到son2时,结果可就不是Num[son2]*(n-Num[son2]-1)了,因为这样会与son1得到的结果重复一部分,
    应该是Num[son2]*(n-Num[son2]-Num[son1]-1),以此类推son3得到Num[son3]*(n-Num[son3]-Num[son2]-Num[son1]-1)。
    发现我们只需要用temp标记已经使用过的Num[son]的个数,对于每个son得到Num[son]*(n-temp-Num[son]-1),最后加起来就行了。
    PS:本题巨坑!!!!!long long 大发好!!

  • 相关阅读:
    ==和equals区别
    如何创建一个不可变类
    mysql用户的创建和授权
    事务
    Java知识点检测
    Redis
    正则表达式中match的用法
    rfind的用法
    找出文件夹里所有的文件路径
    合并多个pdf文件
  • 原文地址:https://www.cnblogs.com/agenthtb/p/5962697.html
Copyright © 2011-2022 走看看