ABBA

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;
}