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

7 篇文章 0 订阅

**

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值