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