思路:
可以模拟一下题意,就是建立一个树,树的(的数量大于等于)的数量。
数据较大,所以可以建立二维数组,记录每次遇到的情况,dp[i][j][k]数组表示i个左括号,j个右括号,
选取的状态为k时的满足已选择的边的数量。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn = 1002;
const LL MOD = 1e9+7;
int n;
LL dp[maxn][maxn][2]={0};
LL dfs(int c1,int c2,int fg){
if(c2==n) return 0;
if(dp[c1][c2][fg]) return dp[c1][c2][fg];
LL ans = 0;
if(c1<n){
int k = !fg;
if(fg==0) ans = (1+dfs(c1+1,c2,k))%MOD;//fg=0表示下一次可以选择,数量+1
else ans = dfs(c1+1,c2,k)%MOD;
}
if(c2<c1){
int k = !fg;
if(fg==0) ans = (ans+1+dfs(c1,c2+1,k))%MOD;
else ans = (ans+dfs(c1,c2+1,k))%MOD;
}
dp[c1][c2][fg] = ans;
return ans;
}
int main(void)
{
scanf("%d",&n);
printf("%lld\n",(1+dfs(1,0,1))%MOD);
return 0;
}