problem

luogu-P3757

solution

observation:\text{observation}:observation: hi/2−hih_{i/2}-h_ihi/2​−hi​ 的大小关系,其实就是个二叉树的大小关系。

这很类似之前的排列 dpdpdp ,迁移过来,我们尝试 f(i,j):if(i,j):if(i,j):i 在子树内第 jjj 小的方案数。

当所有符号都是一个方向的时候,就是 [ZJOI2010]排列计数的题解,所以我们类比这里应该也是有组合数计算转移的。

同样是编号划分离散化的理解。

假设当前点为 uuu,儿子为 vvv,枚举 uuu 为其所在连通块的第 iii 小,vvv 为其所在联通块的第 jjj 小:

  • hu<hvh_u<h_vhu​<hv​。

    考虑合并后,uuu 可能在新大小为 sizu+sizvsiz_u+siz_vsizu​+sizv​ 的连通块中的排名。

    这就要看 vvv 所在联通块前 jjj 小的数与 huh_uhu​ 的关系了。

    但一定不会到 i+ji+ji+j。

    所以,枚举合并后 uuu 的排名为 kkk,i≤k<i+ji\le k<i+ji≤k<i+j。

    f(u,k)←f(u,i)∗f(v,j)∗(k−1i−1)∗(sizu+sizv−ksizu−i)f(u,k)\leftarrow f(u,i)*f(v,j)*\binom{k-1}{i-1}*\binom{siz_u+siz_v-k}{siz_u-i}f(u,k)←f(u,i)∗f(v,j)∗(i−1k−1​)∗(sizu​−isizu​+sizv​−k​)

  • hu>hvh_u>h_vhu​>hv​。

    转移方程式和原理同上一种情况,只是 kkk 的范围有所变化,i+j≤k≤i+sizvi+j\le k\le i+siz_vi+j≤k≤i+sizv​。

时间复杂度为 O(n3)O(n^3)O(n3)。

前缀和优化 O(n2)O(n^2)O(n2) 可以看[HEOI2013]SAO的题解。

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mod 1000000007
#define maxn 105
char s[maxn];
int n;
int c[maxn][maxn], f[maxn][maxn], g[maxn], siz[maxn];void dfs( int u ) {f[u][1] = siz[u] = 1;for( int o = 0;o <= 1;o ++ ) {int v = (u << 1) + o;if( v > n ) break;dfs( v );memcpy( g, f[u], sizeof( f[u] ) );memset( f[u], 0, sizeof( f[u] ) );for( int i = 1;i <= siz[u];i ++ )for( int j = 1;j <= siz[v];j ++ )if( s[v] == '>' ) {for( int k = i + j;k <= i + siz[v];k ++ )(f[u][k] += g[i] * c[k - 1][i - 1] % mod * f[v][j] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}else {for( int k = i;k < i + j;k ++ )(f[u][k] += g[i] * c[k - 1][i - 1] % mod * f[v][j] % mod * c[siz[u] + siz[v] - k][siz[u] - i]) %= mod;}siz[u] += siz[v];}
}signed main() {scanf( "%lld %s", &n, s + 2 );for( int i = 0;i <= n;i ++ ) {c[i][0] = c[i][i] = 1;for( int j = 1;j < i;j ++ )c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % mod;}dfs( 1 );int ans = 0;for( int i = 1;i <= n;i ++ ) (ans += f[1][i]) %= mod;printf( "%lld\n", ans );return 0;
}

[CQOI2017] 老C的键盘(树形dp + 组合数)相关推荐

  1. 4824: [Cqoi2017]老C的键盘3167: [Heoi2013]Sao

    题意: 对一棵树的边定向,求拓扑序方案数. 题解: 因为两颗子树相对独立,所以可以树形dp. f [ x ] [ i ] f[x][i] f[x][i]表示x这棵子树,根节点在序列第i位,转移什么就随 ...

  2. BZOJ 4813: [Cqoi2017]小Q的棋盘 (树形dp)

    题目传送门 Solution 树形背包dp大水题,是POJ某道题的弱化版...不想说了,据说贪心也能过此题.. 一开始50分,dp数组初始化炸了,表示无语.. Code #include <io ...

  3. [HEOI2013] SAO(dp + 组合数 + 前缀和)

    problem luogu-P4099 solution 两篇前提题解:排列计数,老C的键盘 想必已经看了 CQOI2017 老C的键盘 一题题解了. 这里直接考虑优化状态转移方程. 我们发现 f(u ...

  4. NKOJ 4043 (CQOI 2017) 老C的键盘 (树形DP)

    P4043老C的键盘 此题由于给出的字符串,很容易想到变成一颗树,于是容易想到树形DP. 注意到将1-n分配到一棵树的时候,数的具体值是没有意义的,因此每一次往下分都可以认为是将1-size的排列分到 ...

  5. UOJ Round #20 T1 A. 【UR #20】跳蚤电话(组合数+树形DP)

    UOJ Round #20 T1 A. [UR #20]跳蚤电话 题目大意 给出一棵树,求建出该树的不同操作方案数.建树方式如下:初始 S S S集合只有 1 1 1,操作 1 1 1为取已连的边 x ...

  6. Luogu4099 HEOI2013 SAO 组合、树形DP

    传送门 值得注意的是一般的DAG的拓扑序列数量是NP问题,所以不能直接入手 题目中给出的图可以看做是一个树形图,虽然方向比较迷.考虑使用树形图的性质 不妨任选一个点为根做树形DP,注意到数的位置与方案 ...

  7. HDU - 4705 Y(树形dp)

    题目链接:点击查看 题目大意:给出一棵树,求三个点不在一条线上的个数 题目分析:正难取反,正着求不管是暴力还是有点技巧都是实现不了的,我们可以求出来三个点在一条直线上的方案数,然后用总的排列组合的方案 ...

  8. hdu 6035:Colorful Tree (2017 多校第一场 1003) 【树形dp】

    题目链接 单独考虑每一种颜色,答案就是对于每种颜色至少经过一次这种的路径条数之和.反过来思考只需要求有多少条路径没有经过这种颜色即可. 具体实现过程比较复杂,很神奇的一个树形dp,下面给出一个含较详细 ...

  9. hdu1520 (树形dp)

    hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结 ...

最新文章

  1. 双指针找链表中点多种写法
  2. 剑指offer六:旋转数组的最小数字
  3. 成功解决TypeError: map() got an unexpected keyword argument 'num_threads'
  4. 《系统集成项目管理工程师》必背100个知识点-44应急储备和管理储备
  5. C++ 标准输入输出流
  6. H5添加QQ好友的链接
  7. c++ 删除二叉树的子树_平衡二叉树
  8. 大数据与Hadoop
  9. pytorch的4种边界Padding方法--ZeroPad2d、ConstantPad2d、ReflectionPad2d、ReplicationPad2d
  10. Maven搭建springMvc+myBatis完整项目
  11. 【codevs1281】Xn数列,矩阵乘法练习
  12. python大气校正_Python 处理遥感图像:光谱辐射定标、大气校正和计算反射率
  13. java多张图片合成一张_利用溶图技巧把多张图片合成一张奇幻风格图片教程
  14. python实现在线答题_python实现用户答题功能
  15. AE Pixel Sorter 2 for Mac破解教程
  16. JRebel设置快捷键+激活方式
  17. 如何删除“我的电脑”、“此电脑”中坚果云图标--三种方法(2020年的可行方案)
  18. c语言劫持dll写法,[原创]DLL劫持生成器 源码开放(纯WINDOWS SDK)+ 实例分析
  19. 非标自动化机械设计行业未来发展趋势
  20. 曾国藩:做人守拙,做事守缺

热门文章

  1. 讲100个科学道理,不如做这些有趣的理科实验!
  2. 从一个骗局谈生活中的基础算法
  3. wdcp服务器/虚拟主机管理系统,wdcp服务器/虚拟主机管理系统1.1发布(最后更新20110423)...
  4. php xmlhttprequest,DOM XMLHttpRequest
  5. php 电压 异常,tv断线警告是什么原因
  6. html插入图片和文字,HTML第三课文字图片插入
  7. apache weblogic ssl linux,apache基于ssl配置weblogic(完结篇)
  8. mysql列增减_Mysql基本操作——增减改查
  9. sql java 创建数据库_java动态创建数据库(sql server)
  10. 陕西省计算机二级报名流程,计算机二级考试报名流程