[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数
4824: [Cqoi2017]老C的键盘
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 218 Solved: 171
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
共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
将原数列建成一颗二叉树。
对于一个节点i,f[i][j]表示节点在子树中排名为j的方案数。
转移的时候枚举每个子树中有多少个在它前面即可。
根据复杂度分析后可得时间复杂度为O(n^2)
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define ll long long
#define mod 1000000007
#define maxn 1001
using namespace std;
inline ll read() {
ll x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
struct data {int to,nxt,tp;}e[maxn*];
int head[maxn],cnt;
inline void add(int u,int v,int tp) {e[cnt].to=v;e[cnt].nxt=head[u];e[cnt].tp=tp;head[u]=cnt++;}
ll n,ans,jc[maxn],inv[maxn];
ll f[maxn][maxn],g[maxn][maxn],sz[maxn],t[maxn][maxn];
char s[maxn];
inline ll C(int x,int y){return jc[x]*inv[y]%mod*inv[x-y]%mod;}
void dp(int x) {
sz[x]=;f[x][]=;
if((x<<)<=n) add(x,x<<,s[x<<]=='>'?:);
if(((x<<)|)<=n) add(x,(x<<)|,s[(x<<)|]=='>'?:);
for(int i=head[x];i>=;i=e[i].nxt) {
int to=e[i].to;dp(to);
for(int j=sz[x];j>=;j--) {
for(int k=sz[to];k>=;k--) {
if(e[i].tp==) t[x][j+k]=(t[x][j+k]+f[to][k]*C(j+k-,k)%mod*C(sz[x]+sz[to]-j-k,sz[to]-k)%mod*f[x][j])%mod;
else t[x][j+k]=(t[x][j+k]+g[to][k+]*C(j+k-,k)%mod*C(sz[x]+sz[to]-j-k,sz[to]-k)%mod*f[x][j])%mod;
}
}
sz[x]+=sz[to];
for(int j=;j<=sz[x];j++) f[x][j]=t[x][j],t[x][j]=;
}
for(int i=sz[x];i>=;i--) g[x][i]=(g[x][i+]+f[x][i])%mod;
for(int i=;i<=sz[x];i++) f[x][i]=(f[x][i]+f[x][i-])%mod;
}
int main(){
memset(head,-,sizeof(head));
n=read();
scanf("%s",s+);
inv[]=inv[]=jc[]=jc[]=;
for(int i=;i<=n;i++) jc[i]=jc[i-]*i%mod,inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=n;i++) inv[i]=inv[i]*inv[i-]%mod;
dp();
printf("%lld\n",f[][sz[]]);
return ;
}
[BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数的更多相关文章
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 193 Solved: 149[Submit][Statu ...
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
每一个限制条件相当于一条有向边, 忽略边的方向,就成了一道裸的树形DP题 同BZOJ3167 唯一的区别就是这个$O(n^3)$能过 #include <map> #include < ...
- [bzoj4824][Cqoi2017]老C的键盘
来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...
- BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】
题目链接 BZOJ4824 题解 观察出题目中的关系实际上是完全二叉树的父子关系 我们设\(f[i][j]\)为以\(i\)为根的节点在其子树中排名为\(j\)的方案数 转移时,枚举左右子树分别有几个 ...
- [CQOI2017]老C的键盘
[CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...
- [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...
- bzoj 4824: [Cqoi2017]老C的键盘
Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...
- Luogu P3757 [CQOI2017]老C的键盘
题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...
- 洛谷 P3757 [CQOI2017]老C的键盘
题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...
随机推荐
- linux 常见服务端口
Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户.提供这些服务的程序是由运行在后台的守护进程(daemons) 来执行的.守护进 ...
- 中国MOOC_面向对象程序设计——Java语言_第2周 对象交互_秒计时的数字时钟
第2周编程题 查看帮助 返回 第2周编程题,在课程所给的时钟程序的基础上修改 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系 ...
- 将shell返回的结果保存至数组
如下,我需要将u1和u2提取出保存至数组,方便后续的调用 root@ubuntu:~# lxc list+------+---------+------------------------------ ...
- Codeforces Round #332 (Div. 2)B. Spongebob and Joke
B. Spongebob and Joke time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- arm开发板刷机方法
1.linux系统启动方式 bootloader->kernel->system 在嵌入式系统中内存为DRAM,inand flash 都不能直接启动需要被初始化.其中初始化程序在(boo ...
- 南阳ACM 题目8:一种排序 Java版
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...
- iOS Button设置
UIButton *kefuBtn = [[UIButton alloc]initWithFrame:CGRectMake(, , , )]; kefuBtn.backgroundColor = SX ...
- git设置免密码登录
设置用户名和邮箱 git config --global user.name "<username>" git config --global user.email & ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 【CODEVS】3546 矩阵链乘法
[算法]区间DP [题解] 注意先输出右括号后输出左括号. f[i][i+x-1]=min(f[i][i+x-1],f[i][j]+f[j+1][i+x-1]+p[i]*p[j+1]*p[i+x]) ...