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;
}
View Code

 

posted @ 2017-05-02 13:21  lawyer'  阅读(203)  评论(0编辑  收藏  举报