假如我们把A看成1,把B看成-1的话, 根据他的条件,会发现他们的前缀和满足一个规律:在负m到n之间。然后枚举每个位置,后面是加一还是减一就行了。如果超过范围直接就判为零,表示就不存在这个情况。最后把所有的结果都找出来就可以啦。
#include<bits/stdc++.h>
#define int long long
#define mod 1000000007
using namespace std;
int dp[3010][3010];
signed main()
{
ios::sync_with_stdio(false);
int n,m;
while(cin >> n >> m)
{
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)
dp[i][j] += dp[i-1][j];
if(j)
dp[i][j] += dp[i][j-1];
dp[i][j] %= mod;
if(i - j > n || j - i > m)
dp[i][j] = 0;
}
}
cout << dp[n+m][n+m] << endl;
}
return 0;
}