Description

老 C 是个程序员。    
作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序
在某种神奇力量的驱使之下跑得非常快。小 Q 也是一个程序员。有一天他悄悄潜入了老 C 的家中,想要看看这个
键盘究竟有何妙处。他发现,这个键盘共有n个按键,这n个按键虽然整齐的排成一列,但是每个键的高度却互不相同
。聪明的小 Q 马上将每个键的高度用 1 ~ n 的整数表示了出来,得到一个 1 ~ n 的排列 h1, h2,..., hn 。为了
回去之后可以仿造一个新键盘(新键盘每个键的高度也是一个 1 ~ n 的排列),又不要和老 C 的键盘完全一样,小 Q
 决定记录下若干对按键的高度关系。作为一个程序员,小 Q 当然不会随便选几对就记下来,而是选了非常有规律的
一些按键对:对于 i =2,3, ... , n,小 Q 都记录下了一个字符<或者>,表示 h_[i/2] < h_i 或者h _[i/2] > h_i 
。于是,小 Q 得到了一个长度为n ? 1的字符串,开开心心的回家了。现在,小 Q 想知道满足他所记录的高度关系的
键盘有多少个。虽然小 Q 不希望自己的键盘和老 C 的完全相同,但是完全相同也算一个满足要求的键盘。答案可
能很大,你只需要告诉小 Q 答案 mod 1,000,000,007 之后的结果即可。
 

Input

输入共 1 行,包含一个正整数 n 和一个长度为 n ? 1 的只包含<和>的字符串,分别表示键
盘上按键的数量,和小 Q 记录的信息,整数和字符串之间有一个空格间隔。
 

Output

输出共 1 行,包含一个整数,表示答案 mod 1,000,000,007后的结果。    

Sample Input

5 <>><

Sample Output

3
共5个按键,第1个按键比第2个按键矮,第1个按键比第3个按键高,第2个按键比第4个
按键高,第2个按键比第5个按键矮。
这5个按键的高度排列可以是 2,4,1,3,5 , 3,4,1,2,5 , 3,4,2,1,5 。

HINT

Source

之前看到这个题的时候毫无想法,现在看起来和实验比较的做法差不多(这个题好像有原题,bzoj 2111 和 bzoj 3167)

woc这原来都是一个题,但是这题我的做法和实验比较的做法差不多;

首先题目给了一棵完全二叉树,然后给了父亲和儿子的关系,那么我们设dp[i][j],表示i的子树内,i的排名为j的方案数;

然后做法流程和实验比较类似,合并(x,i),(y,j)时首先分情况枚举合并后x的rank为k;

1.x>y;

那么k从i枚举到i+j-1,然后就相当于这样一个问题:

前半段有k-1个盒子,i-1个红球,k-1-(i-1)个蓝球,后半段有size[x]+size[y]-k个盒子,有size[x]-i个红球,...个蓝球,

红蓝球都有顺序;

然后问每个盒子都填了一个球,而且红蓝球的内部顺序不变的方案数:

那么转移就是:

2.x<y

k就是从i+j,枚举到i+size[y],然后转移是一模一样的;

然后具体实现方法和实验比较一样。。。

//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=1050;
const int Mod=1e9+7;
ll c[N][N],size[N],dp[N][N],g[N],head[N],to[N],nxt[N],type[N],cnt,n;
char s[N];
void lnk(int x,int y,int z){
to[++cnt]=y,nxt[cnt]=head[x],type[cnt]=z,head[x]=cnt;
}
void dfs(int x){
size[x]=1;
for(int p=head[x];p;p=nxt[p]){
int y=to[p],flg=type[p];dfs(y);
if(flg==1){
if(size[x]==1){
for(int i=1;i<=size[y];i++){
for(int j=1;j<=i;j++) (dp[x][j]+=dp[y][i])%=Mod;
}
size[x]+=size[y];
for(int i=1;i<=size[x];i++) g[i]=dp[x][i];
}
else{
int tot=size[x]+size[y];
for(int i=1;i<=size[x];i++){
for(int j=1;j<=size[y];j++){
for(int k=i;k<=i+j-1;k++){
(g[k]+=dp[x][i]*dp[y][j]%Mod*c[k-1][i-1]%Mod*c[tot-k][size[x]-i]%Mod)%=Mod;
}
}
}
size[x]+=size[y];
for(int i=1;i<=size[x];i++) dp[x][i]=g[i];
}
}
else {
if(size[x]==1){
for(int i=1;i<=size[y];i++){
for(int j=i;j<=size[y];j++) (dp[x][j+1]+=dp[y][i])%=Mod;
}
size[x]+=size[y];
for(int i=1;i<=size[x];i++) g[i]=dp[x][i];
}
else{
int tot=size[x]+size[y];
for(int i=1;i<=size[x];i++){
for(int j=1;j<=size[y];j++){
for(int k=i+j;k<=i+size[y];k++){
(g[k]+=dp[x][i]*dp[y][j]%Mod*c[k-1][i-1]%Mod*c[tot-k][size[x]-i]%Mod)%=Mod;
}
}
}
size[x]+=size[y];
for(int i=1;i<=size[x];i++) dp[x][i]=g[i];
}
}
}
if(size[x]==1) dp[x][1]=1;
memset(g,0,sizeof(g));
}
int main(){
scanf("%lld",&n);scanf("%s",s+1);
for(int i=2;i<=n;i++){
if(s[i-1]=='<') lnk(i/2,i,1);
if(s[i-1]=='>') lnk(i/2,i,2);
}
for(int i=0;i<=n;++i) c[i][0]=1;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%Mod;
}
dfs(1);ll ans=0;
for(int i=1;i<=size[1];i++) (ans+=dp[1][i])%=Mod;
printf("%lld\n",ans);
return 0;
}

bzoj 4824: [Cqoi2017]老C的键盘的更多相关文章

  1. BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP

    每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...

  2. bzoj 4824: [Cqoi2017]老C的键盘【树形dp】

    参考:https://www.cnblogs.com/FallDream/p/bzoj4824.html 画一画就会发现关系形成了一棵二叉树(其实看到n-1就能想到 然后dp,设f[i][j]为点i在 ...

  3. [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 218  Solved: 171[Submit][Statu ...

  4. [BZOJ4824][CQOI2017]老C的键盘(树形DP)

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 193  Solved: 149[Submit][Statu ...

  5. [CQOI2017]老C的键盘

    [CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...

  6. bzoj 4822: [Cqoi2017]老C的任务

    4822: [Cqoi2017]老C的任务 练手速... #include <iostream> #include <cstdio> #include <cstring& ...

  7. bzoj 4823: [Cqoi2017]老C的方块 [最小割]

    4823: [Cqoi2017]老C的方块 题意: 鬼畜方块游戏不解释... 有些特殊边,有些四个方块组成的图形,方块有代价,删掉一些方块使得没有图形,最小化代价. 比较明显的最小割,一个图形中必须删 ...

  8. [bzoj4824][Cqoi2017]老C的键盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...

  9. [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

    Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...

随机推荐

  1. ORACLE 错误代码提示归集

    有时数据库出现问题,不是每次都有网络可查,所以把所有的ora系列的错误整理出来, 在最没有办法的时候,需要自己来解决,有了这些根据,问题会好办的.虽说对于数据库方面, DBA很强大,他们在遇到错误时, ...

  2. 升级PyCham到2017.3后import sys模块报错的问题

    今天PyCharm提示升级后选择了更新,根据提示更新成功(2017.3)后发现总是报无法找到sys模块的错误,截图如下: 其实有一条红线留在那里也不影响运行和使用,但总看着不爽. 经过一番研究,由于我 ...

  3. Code Kata:大整数比较大小&大整数四则运算---加减法 javascript实现

    大整数的四则运算已经是老生常谈的问题了.很多的库也已经包含了各种各样的解决方案. 作为练习,我们从最简单的加减法开始. 加减法的核心思路是用倒序数组来模拟一个大数,然后将两个大数的利用竖式进行运算. ...

  4. CentOS LNMP环境搭建 各版本

    我们先下载系统包. 以下centos6.5 X64系统 进行演示.本环境适应Centos5.x CentOs6.x Centos7.x    32和64版本.如有错误请回复本文主要安装代码汇总 [PH ...

  5. 五十个小技巧提高PHP执行效率(一)

    在项目开发过程中,经常遇到了一些PHP处理程序性能底下的情况,程序运行在centos+nginx环境,虽然这个有很多的原因如:服务器本身配置,运行环境nginx服务,php-fpm配置等等,更多有一点 ...

  6. 【下一代核心技术DevOps】:(五)微服务CI与Rancher持续集成

    1. 引言 DevOps的核心魅力是快速的持续集成交付,降低研发和实施运维之间的交互,使得传统的各种扯皮现象统统消失.最重要的是降低成本 保障产品交付可靠性. 使用Rancher作为持续集成的关键环节 ...

  7. bitcms内容管理系统 3.1版源码发布

    开源bitcms内容管理系统采用ASP.NET MVC5+MySql的组合开发,更适应中小型系统低成本运行. bitcms的主要功能 1.重写了APS.NET MVC的路由机制.bitcms使用路由参 ...

  8. [Android App]IFCTT,即:If Copy Then That,是一个基于IFTTT的"This"实现

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/8075738.html IFCTT,即:If Copy Then ...

  9. 时间紧任务重---extjs的学习就这么开始吧

    我们的extjs借助了一个模板引擎--artTemplate,它是一个开源的项目,不多说,给个链接吧:http://aui.github.io/artTemplate/ 直接上代码: <!DOC ...

  10. db2 update 异常

    报错: -错误的sql语句:update Persons SET FirstName = 'Fred' WHERE id_P = 1com.ibm.db2.jcc.am.SqlException: O ...