ABBA
想法:可以用组合数学,可以用dp;dp是最简单的方法,我现在建立一个二维dp[i][j],i代表的是前面已有多少个是AB中A的前缀,同理j代表的是前缀中有多少个是BA中B的前缀,然后只要找出下一状态是放A的和放B的一共有多少种就可以了。但是要有违规条件,就是说如果你前面已经找了i个A的前缀的了,j个B的前缀的,那么你如果i-j>n;代表你后面就是再多也最多和前面加起来一共能有m-1个B的前缀的,就不符合,同理,另一个判断条件也是。
#include<bits/stdc++.h>
usingnamespacestd;
typedeflonglongll;
constll mod=1e9+7;
constintN=2e3+7;
ll dp[N][N];
intmain()
{
intn,m;
while(~scanf("%d%d",&n,&m)){
for(inti=0;i<=n+m;i++){
for(intj=0;j<=n+m;j++){
dp[i][j]=0;
}
}
for(inti=0;i<=n;i++) dp[i][0]=1;
for(inti=0;i<=m;i++) dp[0][i]=1;
for(inti=1;i<=n+m;i++){
for(intj=1;j<=n+m;j++){
if(i-n>j) dp[i][j]=0;
elseif(j-m>i) dp[i][j]=0;
elsedp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;
}
}
printf("%lld\n",dp[n+m][n+m]);
}
return0;
}