dp[i][j]表示的是当有i个A,j个B时,符合要求的字符串数。转移方程详情看注释。
参考博客:https://blog.csdn.net/chenshibo17/article/details/96455518
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e3+10;
const ll mod = 1e9+7;
int n,m;
ll dp[N][N];
int main(void)
{
while(~scanf("%d%d",&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(j>=i+1-n)
//当i+1>n时,现有的B要足够用才行,
//因为这个A有可能是BA中的A,对于AB用到的A没限制,
//总会有因为最后总会有B与其配成AB。
dp[i+1][j]=(dp[i+1][j]+dp[i][j])%mod;
if(i>=j+1-m)
//同理,当j+1>m时,现有的A足够用才行,
//因为这个B有可能是AB中的B。
dp[i][j+1]=(dp[i][j+1]+dp[i][j])%mod;
}
printf("%lld\n",dp[n+m][n+m]);
}
return 0;
}