bzoj 4824: [Cqoi2017]老C的键盘【树形dp】
2018-03-08 21:31
597 查看
参考:https://www.geek-share.com/detail/2706547824.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 ,g ,si ,t ,y ; char c ; 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; }
相关文章推荐
- [BZOJ4824][CQOI2017]老C的键盘(树形DP)
- BZOJ4824 [Cqoi2017]老C的键盘 【树形dp】
- [树形DP] BZOJ 4824 [Cqoi2017]老C的键盘
- BZOJ 4824 [Cqoi2017]老C的键盘 ——树形DP
- bzoj 4813: [Cqoi2017]小Q的棋盘 [树形背包dp]
- bzoj 4824: [Cqoi2017]老C的键盘
- NKOJ 4043 (CQOI 2017) 老C的键盘 (树形DP)
- 【BZOJ4824】 [Cqoi2017]老C的键盘
- bzoj 4813: [Cqoi2017]小Q的棋盘 树形dp
- bzoj 4813: [Cqoi2017]小Q的棋盘【树形dp】
- BZOJ 1813 [Cqoi2017]小Q的棋盘 ——树形DP
- [bzoj4824][Cqoi2017]老C的键盘
- BZOJ 4813: [Cqoi2017]小Q的棋盘 (树形dp)
- cqoi2017,bzoj4813小Q的棋盘(树形dp或瞎搞)
- Bzoj 4824: [Cqoi2017]老C的键盘
- BZOJ 1304: [CQOI2009]叶子的染色 树形dp
- [BZOJ4784][ZJOI2017]仙人掌(树形DP)
- bzoj4813 [Cqoi2017]小Q的棋盘(树形dp)
- bzoj4871: [Shoi2017]摧毁“树状图” //树形dp
- bzoj4813 [Cqoi2017]小Q的棋盘 树上DP