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

 注意:

有的时候memset会出问题

思路:

i代表A,j代表B,题目要求n个AB,m个BA,所以在一个字符串中,前n个A贡献给AB中的A,前m个B贡献给BA中的B,这里用到贪心的思想

所以当i<=n时,直接用于贡献给AB中的A,当i>n时,i-n个A用来组成BA,因此当j>i-n时,此时可以放A组成BA,例如当j=3,i-n=2时,可以再放一个A组成3个BA,dp[i+1][j]=dp[i+1][j]+dp[i][j];同理,当i>j-m时,可以放B组成BA;最后不要忘了%mod.

代码:

#include<iostream>
using namespace std;
const int maxn = 2005;
const int mod = 1e9+7;
int dp[maxn][maxn];
int main(){
    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(j+n>i)
                    dp[i+1][j] = (dp[i+1][j]+dp[i][j])%mod;
                if(i+m>j)
                    dp[i][j+1] = (dp[i][j+1]+dp[i][j])%mod;                    
            }
        }
        cout<<dp[n+m][n+m]<<endl;
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/lusiqi/p/12355120.html