题意:n1个仆人,n2个骑士排成一排,不能有连续的k1个仆人,也不能有连续的k2个骑士,有多少种组合
思路:记忆搜索,看代码
代码:
#define LL long long
#define maxn 102
#define mod 100000000
#define INF 0x3f3f3f3f
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
using namespace std;
LL dp[maxn][maxn][3][12];
int n1, n2, k1, k2;
int dfs(int a, int b, int t, int d)
{
if (a > n1 || b > n2) return 0;
if (t == 1 && d > k1) return 0;
if (t == 2 && d > k2) return 0;
if (dp[a][b][t][d] != -1) return dp[a][b][t][d];
if(a + b == n1 + n2) return 1;
int ans = 0;
if(t == 1) {
ans += dfs(a + 1, b, 1, d + 1) % mod;
ans += dfs(a, b + 1, 2, 1) % mod;
return dp[a][b][t][d] = ans;
}
if(t == 2) {
ans += dfs(a + 1, b, 1, 1) % mod;
ans += dfs(a, b + 1, 2, d + 1) % mod;
return dp[a][b][t][d] = ans;
}
}
int main()
{
_;
cin >> n1 >> n2 >> k1 >> k2;
int ans = 0;
mem(dp, -1);
ans = (ans + dfs(1, 0, 1, 1)) % mod;
ans = (ans + dfs(0, 1, 2, 1)) % mod;
cout << ans << endl;
return 0;
}