传送门:https://ac.nowcoder.com/acm/contest/881/E
题意:构造一个长为 的字符串,使得能从中按顺序挑出 n个"AB"子串和 m个"BA"子串,问这样的字符串一共有多少个。
思路:定义表示有i个AA,j个BB的方案数.则转移就是在当前串上在添加一个A或添加一个B的问题,即是和.考虑当前的,如果则会多出k个A,也就是需要k个B来和这些多出的A配对此时的状态方程为另一种情况同理,即是
#include<bits/stdc++.h>
using namespace std;
int dp[2005][2005];
const int mod = 1e9 + 7;
int main()
{
int n, m;
while(scanf("%d %d",&n,&m)!=EOF)
{
for(int i = 0; i <= n + m; i++)
{
for(int j = 0; j <= n + m; j++)
dp[i][j] = 0;
}
dp[0][0] = 1;
for(int i = 0; i <= n + m; i++)
{
for(int j = 0; j <= n + m; j++)
{
if(i - j < n)
dp[i + 1][j] += dp[i][j];
if(j - i < m)
dp[i][j + 1] += dp[i][j];
dp[i][j + 1] %= mod;
dp[i + 1][j] %= mod;
}
}
cout << dp[n + m][n + m] << endl;
}
}