zoukankan      html  css  js  c++  java
  • HDU 多校联合第六场

    uestc的题。。。果然,题意都弄得这么晦涩。

    01

    推个规律,mod r。偶推错了。。。1个小时才过。

    06

    三分做的。还是不知道怎么证明他是凹函数,话说。。以为神人想当然的说这是凹函数。。。怎么证明?管他呢,真没劲!

    08

    话说偶已经推出来s1的和sum1,s2的和sum2。sum1 - sum2必为偶数,才能YES。。。但是对于字符串长度为2时这个规律无效。。。。所以。。。偶没敢写

    这题太神了。。。怀疑是tc上的题改的。。

     09

    树形dp。两种方法

    一个共有的性质。左孩子中的最大值小于右孩子中的最大值。(因为序列为 2^0, 2^1, 2^2...,2^n)

    方法1:

    f[n][d]表示n个节点深度为 1--- d时所有情况的和。

    ans = f[n][d] - f[n][d-1];

    case1:任选一个为根节点,然后这个根节点只有左(右)孩子。f[n][d] = 2*n*f[n-1][d-1];

    case2:枚举左孩子中节点的个数[1, n - 2],因为任选一个为根,最大的那个一定在右孩子里。这样消耗掉两个,所以是n - 2; f[n]dj] +=  n*C(n-2, i)*f[i][d-1]*f[n-i-1][d-1];

    这样状态就写完了,注意n == 1的时候f[1][x] = 1;

    记忆化搜索实现比较方便

    方法2:

    dp[n][d]表示n个节点深度为d的情况数。sum[n][d] 表示n个节点深度为 1--- d时所有情况的和。

    ans = dp[n][d];

    case1:任选一个为根节点,然后这个根节点只有左(右)孩子。dp[n][d] = 2*n*dp[n-1][d-1];

    case2:枚举左孩子中节点的个数[1, n - 2],有两种情况,a).左孩子深度为d - 1,b)右孩子深度为d - 1.

    这两个的和为 dp[i][d-1]*sum[n-i-1][d-1] + dp[n-i-1][d-1]*sum[i][d-1] ;因为重复计算了左右孩子深度都为d-1的情况,所以要再减掉一个dp[i][d-1]*d[n-i-1][d-1];

    dp[n][d] += n*C(n-2, i)* (dp[i][d-1]*sum[n-i-1][d-1] + dp[n-i-1][d-1]*sum[i][d-1]  - dp[i][d-1]*d[n-i-1][d-1])

    sum[n][d] = sum[n][d-1] + dp[n][d]; (sum[][]初始化时,sum[1][x] = 1。)

    if(d > n)  sum[n][d] = sum[n][d-1];

    递推实现

    ------------------------分割线 -----------------------------------

    ps:其实这两种方法本质是一样的。。。是我吃饱了撑的给它分开。。。。

    ps2:注意mod。

  • 相关阅读:
    VC++学习(1):Windows程序内部运行原理
    VC++学习(9):定制应用程序外观
    VC++学习(7):对话框编程
    VC++学习(3):MFC框架程序剖析
    VC++学习(5):文本编程
    VC++学习(4):简单绘图
    DbgPrint/KdPrint输出格式控制
    常用的正则表达式
    使用geoserver+openLayers加载google地图
    retunValue与opener的用法
  • 原文地址:https://www.cnblogs.com/vongang/p/2632229.html
Copyright © 2011-2022 走看看