HDU7239 Matryoshka Doll (DP)

题目大意:

题目描述. 有𝑛个套娃,大小为𝑎1 ≤ 𝑎2 ≤ … ≤ 𝑎𝑛,现在要将这些套娃分成𝑘组,每组套娃按照大小排序后相邻两个套娃之间的大小差距要求≥ 𝑟,求方案数。

解析:

求方案数, 考虑DP。

dpi,j表示前i个套娃分成j组的方案数。对于套娃i,满足ai - ap>=r时,i才可以放入p所在的组,ai - ap < r那么i和p一定不同组,假设这样的p有x个,那么i可以放在其他j - x组内,或者i单独成一组。

方程: dpi,j = dpi -1,j - 1 + max(j - x, 0) * dpi - 1,j 。

参考代码:

 1 #include <bits/stdc++.h>
 2 #define ll long long 
 3 using namespace std;
 4 const int N = 5010, mod = 998244353;
 5 int T, a[N], dp[N][N], n, k, r;
 6 
 7 int main() {
 8     scanf("%d", &T);
 9     while (T --) {
10         memset(dp, 0, sizeof dp);
11         scanf("%d %d %d", &n, &k, &r);
12         for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
13         int p = 0;
14         dp[0][0] = 1;
15         for (int i = 1; i <= n; i ++) {
16             while (p + 1 < i && a[i] - a[p + 1] >= r) p ++;
17             int s = i - p - 1;
18             //s = i - (p + 1) + 1 - 1
19             for (int j = s + 1; j <= i; j ++)
20                 dp[i][j] = (1ll * (j - s) * dp[i - 1][j] + dp[i - 1][j - 1]) % mod;
21         }
22         printf("%d\n", dp[n][k]);
23     }
24     return 0;
25 }

 

 

posted @ 2022-10-08 11:51  YHXo  阅读(55)  评论(0编辑  收藏  举报