2019牛客暑期多校训练营(第一场)E.ABBA

传送门:https://ac.nowcoder.com/acm/contest/881/E

题意:构造一个长为 的字符串,使得能从中按顺序挑出 n个"AB"子串和 m个"BA"子串,问这样的字符串一共有多少个。

思路:定义dp[i][j]表示有i个AA,j个BB的方案数.则转移就是在当前串上在添加一个A或添加一个B的问题,即是dp[i+1][j]+=dp[i][j]dp[i][j+1]+=dp[i][j].考虑当前的dp[i][j],如果i-j>k则会多出k个A,也就是需要k个B来和这些多出的A配对此时的状态方程为dp[i][j+1]+=dp[i][j]另一种情况同理,即是dp[i+1][j]+=dp[i][j]

#include<bits/stdc++.h>
using namespace std;
int dp[2005][2005];
const int mod = 1e9 + 7;
int main()
{
    int n, m;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        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 - j < n)
                    dp[i + 1][j] += dp[i][j];
                if(j - i < m)
                    dp[i][j + 1] += dp[i][j];
                dp[i][j + 1] %= mod;
                dp[i + 1][j] %= mod;
            }
        }
        cout << dp[n + m][n + m] << endl;
    }
}

 

posted @ 2019-07-23 22:19  是妖妖灵鸭  阅读(87)  评论(0编辑  收藏  举报