题目背景
usqwedf 改编系列题。
题目描述
如果你在百忙之中抽空看题,请自动跳到第六行。
众所周知,在中国古代算筹中,红为正,黑为负……
给定一个1×2n 的矩阵(usqwedf:这不是一个 2n 的队列么),现让你自由地放入红色算筹和黑色算筹,使矩阵平衡[即 ∀i∈[1,2n],1∼i 格中红色算筹个数大于等于黑色算筹]。
问有多少种方案满足矩阵平衡(注意红色算筹和黑色算筹的数量必须相等)。
输入格式
正整数 n。
输出格式
方案数 t 对 100取模后的结果。
输入输出样例
输入
2
输出
2
说明/提示
样例解释:
-
方案一:红,黑,红,黑
-
方案二:红,红,黑,黑
数据范围:
1≤n≤100
题解一(dp)
每次放都有两种选择,因此我们只需要一种颜色就可以求出答案
递推方程 dp[i][j]=dp[i-1][j]+dp[i-1][j-1];
代码实现
#include<iostream>
using namespace std;
const int N=510;
int s[N][N]; //前i个格子里放j个红色球
int main(){
int n;
cin>>n;
s[1][1]=1; //一个格子放一个球只有一种情况
for(int i=2;i<=n+n;i++){
for(int j=(i+1)/2;j<=i;j++){ //红色格子的数必须大于等于总格子数的一半
s[i][j]=(s[i-1][j]+s[i-1][j-1])%100;
}
}
cout<<s[2*n][n]<<endl;
return 0;
}
解法二(卡特兰数)
#include<iostream>
using namespace std;
const int N=510;
int s[N];
int main(){
int n;
cin>>n;
s[0]=s[1]=1;
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
s[i]+=s[j-1]*s[i-j];
s[i]%=100;
}
}
cout<<s[n]<<endl;
return 0;
}