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。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-08-10 17:14  AC_Von  阅读(215)  评论(0编辑  收藏  举报