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

**

ABBA

**

链接:https://ac.nowcoder.com/acm/contest/881/E?tdsourcetag=s_pcqq_aiomsg
来源:牛客网

题目描述
Bobo has a string of length 2(n + m) which consists of characters A and B. The string also has a fascinating property: it can be decomposed into (n + m) subsequences of length 2, and among the (n + m) subsequences n of them are AB while other m of them are BA.

Given n and m, find the number of possible strings modulo (10^9+7)(10
9+7).
输入描述:
The input consists of several test cases and is terminated by end-of-file.

Each test case contains two integers n and m.

  • 0 <= n, m <=10^3,0≤n,m≤10 3

  • There are at most 2019 test cases, and at most 20 of them has \max{n, m} > 50max{n,m}>50.
    输出描述:
    For each test case, print an integer which denotes the result.
    示例1
    输入
    1 2
    1000 1000
    0 0
    输出
    13
    436240410
    1

思路

首先看一个题,一个人从(1,1)走到,(n,m),有多少种走法?

for(i = 1; i <= n; i++)
        for(j = 1; j < = m; j++)
        	dp[i][j] = dp[i-1][j] + dp[i][j-1];

这个题的想法和上面差不多,dp[i][j]表示现在串内有i个A,j个B,而dp[i+1][j]或dp[i][j+1]是dp[i][j]可以转移到的状态。具体看代码

代码

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 2005
#define mod (1000000007)
int dp[maxn][maxn];

int main(){
     
    int i, j, n, m, k;
    while(scanf("%d%d",&n,&m)!=EOF){
     
    	if(!n&&!m) return 0;
    	for(int i=0;i<=n+m;i++) //这里不能用memset,会超时
            for(int j=0;j<=n+m;j++)
                dp[i][j]=0;
		dp[0][0] = 1;
	    for(i = 0; i <= n+m; i++){
     
	        for(j = 0; j <= n+m; j++){
     
	            if(i<j+n) dp[i+1][j] = (dp[i][j] + dp[i+1][j])%mod;
	            if(j<i+m) dp[i][j+1] = (dp[i][j] + dp[i][j+1])%mod;
	        }
	    }
	    printf("%d\n",dp[n+m][n+m]);
	}
    return 0;
}

你可能感兴趣的:(思维,dp)