参考:https://www.cnblogs.com/FallDream/p/bzoj4824.html

画一画就会发现关系形成了一棵二叉树(其实看到n-1就能想到

然后dp,设f[i][j]为点i在这棵子树中排名为j,然后组合数乘着转移

这里有一个前缀和优化,返回父亲时,f为前缀和,g为后缀和,便于父节点的转移

#include<iostream>
#include<cstdio>
using namespace std;
const int N=105,mod=1e9+7;
int n,f[N][N],g[N][N],si[N],t[N][N],y[N][N];
char c[N];
void dfs(int u)
{
si[u]=1,f[u][1]=1;
for(int v=u*2;v<=min(n,u*2+1);v++)
{
dfs(v);
si[u]+=si[v];
for(int j=1;j<=si[u];j++)
for(int k=0;k<j;k++)
{
if(c[v]=='>')
t[u][j]=(t[u][j]+1ll*y[j-1][k]*y[si[u]-j][si[v]-k]%mod*f[v][k]%mod*f[u][j-k]%mod)%mod;
else
t[u][j]=(t[u][j]+1ll*y[j-1][k]*y[si[u]-j][si[v]-k]%mod*g[v][k+1]%mod*f[u][j-k]%mod)%mod;
}
for(int j=1;j<=si[u];j++)
f[u][j]=t[u][j],t[u][j]=0;
}
for(int i=si[u];i>0;i--)
g[u][i]=(g[u][i+1]+f[u][i])%mod;
for(int i=1;i<=si[u];i++)
f[u][i]=(f[u][i]+f[u][i-1])%mod;
}
int main()
{
y[0][0]=1;
for(int i=1;i<=100;i++)
{
y[i][0]=1;
for(int j=1;j<=i;j++)
y[i][j]=(y[i-1][j]+y[i-1][j-1])%mod;
}
scanf("%d%s",&n,c+2);
dfs(1);
printf("%d\n",f[1][si[1]]);
return 0;
}

bzoj 4824: [Cqoi2017]老C的键盘【树形dp】的更多相关文章

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

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

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

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

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

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

  4. bzoj 4824: [Cqoi2017]老C的键盘

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

  5. BZOJ 1813 [Cqoi2017]小Q的棋盘 ——树形DP

    唔,貌似以前做过这样差不多的题目. 用$f(i,0/1)$表示从某一点出发,只能走子树的情况下回到根.不回到根的最多经过不同的点数. 然后就可以DP辣 #include <map> #in ...

  6. [CQOI2017]老C的键盘

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

  7. 【BZOJ3167/4824】[Heoi2013]Sao/[Cqoi2017]老C的键盘

    [BZOJ3167][Heoi2013]Sao Description WelcometoSAO(StrangeandAbnormalOnline).这是一个VRMMORPG,含有n个关卡.但是,挑战 ...

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

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

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

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

随机推荐

  1. Java线程的5种状态及切换(透彻讲解)

    http://blog.csdn.net/pange1991/article/details/53860651

  2. BZOJ 3884 拓展欧拉定理

    3884: 上帝与集合的正确用法 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4142  Solved: 1907[Submit][Status][D ...

  3. try catch finally执行顺序 (return / 变量覆盖)

    finally有return 始终返回finally中的return 抛弃 try 与catch中的return 情况1:try{} catch(){}finally{} return x; try{ ...

  4. IOS开发 APP提交程序上传流程

    由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...

  5. Client使用c#和odp.net连接server oracle

    http://blog.csdn.net/educast/article/details/6605655 Oracle.DataAccess.dll有2.X版本和4.X版本,VS2008开发用2.X ...

  6. 【APUE】关于信号的一些常用函数

    kill和raise函数 #include <signal.h> int kill(pid_t pid,int signo); int raise(int signo);//两个函数返回值 ...

  7. Angular结构简单介绍

    在当前项目目录下,使用Angular-CLI生成一个组件:heroes ng generate component heroes 主界面(也就是一个主模块+多个单模块,例如我们创建的heroes(单模 ...

  8. 纯C语言实现简单封装继承机制

    0 继承是OO设计的基础 继承是OO设计中的基本部分,也是实现多态的基础,C++,C#,Objective-C.Java.PHP.JavaScript等为OO而设计的语言,其语言本身对实现继承提供了直 ...

  9. Linux(Ubuntu14.04)下Google Chrome / Chromium标题栏乱码问题

    注:我使用的Linux发行版是Ubuntu 14.04,不同Linux发行版可能会有不同. 最近在使用Chromium的时候tab的标题栏中文显示乱码,在地址栏输入中文是同样时乱码,就像下图: 看起来 ...

  10. 在类的头文件里尽量少引入其它头文件 &lt;&lt;Effective Objective-C&gt;&gt;

    与C 和C++ 一样,Objective-C 也使用"头文件"(header file) 与"实现文件"(implementation file)来区隔代码.用 ...