d[i][j] 表示 放 i 个A j 个 B的方案数
d[i][j] 可以由d[i-1][j] 和d[i][j-1] 得到
当 i <= n ,那么A可以随意放;
当 j <= m,那么B可以随意放;
当 i > n,如果放A,AB的数量要小于等于n,i - j 是至少有多少个AB ,i - j <=n;
当 j > m,如果放B,BA的数量要小于等于m,j - i 是至少有多少个BA ,j - i <=n;
#include<bits/stdc++.h> using namespace std; const int N=2e3+100; const int mod = 1e9+7; int n,m; int d[N][N]; int main(){ while(cin >> n >> m){ for(int i = 0;i <= n+m; i++) for(int j = 0;j <= n+m;j++) d[i][j] = 0; d[0][0]=1; for(int i = 0;i <= n+m; i++){ for(int j = 0;j <= n+m; j++){ if(i-j <= n && i > 0) d[i][j] = (d[i][j] + d[i-1][j]) % mod; if(j-i <= m && j > 0) d[i][j] = (d[i][j] + d[i][j-1]) % mod; } } cout << d[n+m][n+m] << "\n"; } return 0; }