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。