题意简述:给出一个大小为
n
的完全二叉树,每条边上有一个符号,表示相邻两节点数的大小关系,把一个
题解:用
f[i][j]
表示第
i
个节点,排名为
#include<bits/stdc++.h>
typedef long long ll;
const int N = 105;
const int P = 1e9 + 7;
struct edge{
int y,next;
};
edge mp[N];
int n,first[N],size[N],s;
ll c[N][N],f[N][N],g[N][N],temp[N];
char ch[N];
void ins(int x, int y){
mp[++s] = (edge) {y,first[x]};
first[x] = s;
}
void dfs(int cur){
if (cur*2<=n) ins(cur,cur*2);
if (cur*2+1<=n) ins(cur,cur*2+1);
f[cur][1] = g[cur][1] = size[cur] = 1;
for (int t=first[cur]; t>0; t=mp[t].next){
int now = mp[t].y;
dfs(now);
for (int i=1; i<=size[cur]+size[now]; i++) temp[i] = 0;
for (int i=1; i<=size[cur]; i++)
for (int j=0; j<=size[now]; j++)
if (ch[now] == '>')
temp[i+j] += f[cur][i] * g[now][j] % P * c[i-1+j][i-1] % P
* c[size[cur]-i+size[now]-j][size[cur]-i] % P;
else
temp[i+j] += f[cur][i] * (g[now][size[now]] - g[now][j] + P) % P
* c[i-1+j][i-1] % P * c[size[cur]-i+size[now]-j][size[cur]-i] % P;
for (int i=1; i<=size[cur]+size[now]; i++)
f[cur][i] = temp[i] % P, g[cur][i] = (g[cur][i - 1] + f[cur][i]) % P;
size[cur] += size[now];
}
}
int main(){
//freopen("keyboard.in","r",stdin);
//freopen("keyboard.out","w",stdout);
scanf("%d%s",&n,ch+2);
for (int i=0; i<=n; i++)
for (int j=0; j<=n; j++)
if (j == 0 || j == i)
c[i][j] = 1;
else
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % P;
dfs(1);
printf("%lld\n",g[1][size[1]]);
return 0;
}