[CQOI2017]老C的键盘
题解:
显然可以利用条件构成一颗树
不错的一道dp题
f[i][j]表示i点,在子树中排名j
那么转移方程不是特别难得出
其中那个可以用前缀和后缀和优化,即下面代码里的sp数组
枚举第x个位置上它排名为i,然后左儿子有ai个在x之前
之后将分界线两边排列组合一下就可以了
再乘以两边f[x'][i]满足条件的i(难以表述)
for (int i = 1; i <= siz[x]; i++)
for (int j = 0; j < min(i,siz[lc] + 1); j++)
{
int k = i - 1 - j;
int tmp = Mul(C[i - 1][j],C[siz[x] - i][siz[lc] - j]);
if (s[lc] == '>') tmp = Mul(tmp,sp[lc][j]);
else tmp = Mul(tmp,sf[lc][j + 1]);
if (s[rc] == '>') tmp = Mul(tmp,sp[rc][k]);
else tmp = Mul(tmp,sf[rc][k + 1]);
f[x][i] = Add(f[x][i],tmp);
}