Brackets
题意:
给定一个 $n, x, y$ ,问长度为 $2n$ 的合法括号序列中,第$x$个左括号晚于第$y$个左括号匹配的方案数是多少。
解法:
枚举 $C_A,C_B$对于三部分分别求答案即可。
#include <iostream> #include <cstdio> #include <cstring> #define LL long long #define P 1000000007LL #define N 510 using namespace std; LL f[N][N], h[N][N]; int main() { f[0][0] = h[0][0] = 1; for(int i = 0;i < N;i++) for(int j = 0;j < N;j++) { if(i) { f[i][j] += f[i-1][j]; h[i][j] += h[i-1][j]; if(f[i][j] >= P) f[i][j] -= P; if(h[i][j] >= P) h[i][j] -= P; } if(j) { f[i][j] += f[i][j-1]; h[i][j] += h[i][j-1]; if(f[i][j] >= P) f[i][j] -= P; if(h[i][j] >= P) h[i][j] -= P; } if(i < j) f[i][j] = 0; if(i > j) h[i][j] = 0; } int T, n, x, y; scanf("%d", &T); while(T--) { scanf("%d %d %d", &n, &x, &y); LL ans = 0; for(int i = 0;i <= n;i++) for(int j = i;j <= n;j++) { ans += f[x-1][i] * f[y-x-1][j-i]%P * h[n-y][n-j] %P; if(ans >= P) ans -= P; } cout << ans << endl; } return 0; }