2019牛客暑期多校训练营(第一场)E : ABBA(dp)_i++

假如我们把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;
}