2019牛客暑期多校训练营(第一场) E ABBA dp
登录—专业IT笔试面试备考平台_牛客网
https://ac.nowcoder.com/acm/contest/881/E
d[i][j] 表示 放 i 个A j 个 B的方案数
d[i][j] 可以由d[i-1][j] 和d[i][j-1] 得到
当 i <= n ,那么A可以随意放;
当 j <= m,那么B可以随意放;
当 i > n,如果放A,AB的数量要小于等于n,i - j 是至少有多少个AB ,i - j <=n;
当 j > m,如果放B,BA的数量要小于等于m,j - i 是至少有多少个BA ,j - i <=n;
#include<bits/stdc++.h>
using namespace std;
const int N=2e3+100;
const int mod = 1e9+7;
int n,m;
int d[N][N];
int main(){
while(cin >> n >> m){
for(int i = 0;i <= n+m; i++)
for(int j = 0;j <= n+m;j++)
d[i][j] = 0;
d[0][0]=1;
for(int i = 0;i <= n+m; i++){
for(int j = 0;j <= n+m; j++){
if(i-j <= n && i > 0) d[i][j] = (d[i][j] + d[i-1][j]) % mod;
if(j-i <= m && j > 0) d[i][j] = (d[i][j] + d[i][j-1]) % mod;
}
}
cout << d[n+m][n+m] << "\n";
}
return 0;
}
查看13道真题和解析