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 }