HDU 7239:Matryoshka Doll ← 动态规划
【题目来源】
【题目描述】
zyb 在访问莫斯科期间购买了 n 个 matryoshka 玩偶,大小分别为 a1、a2、…、an,从最小到最大排序。
大小为 i 的 matryoshka 可以放入另一个大小为 j 的 matryoshka,当且仅当 j−i≥r、 其中r是某个给定的整数参数。
zyb 希望将所有 n 个 matryoshka 玩偶分成 k 组,这样每个组中都可以形成一个嵌套的 Matryoshka 玩偶,其中一组 Matryoska 玩偶的索引为 c1、c2、…、cm(1≤c1<c2<…<cm≤n) 可以形成嵌套的 matryoshka 玩偶如果 ∀1≤i<m,a[ci]+r≤a[ci+1]。
zyb 想知道有多少种方法可以将 n 个玩偶分成 k 组,以满足上述要求。请注意,诸如 {{1,2}, {3,4}} 和 {{3,4}, {1,2}} 等划分被视为相同的方式。由于答案可能太大,您只需要输出答案模 998244353。
【输入格式】
第一行包含整数T(1≤T≤20) ,表示测试用例的数量。
对于每个测试用例,第一行包含三个整数 n,k,r(1≤k≤n≤5000,1≤r≤1e9),表示 matryoshka 玩偶的数量,zyb 想要划分的组的数量,以及参数。
下一行包含 n 个整数 a1、a2、…、an(1≤a1≤a2≤...≤an≤1e9)表示 matryoshka 玩偶的尺寸。
可以保证 ∑n≤所有测试用例中有 50000 个。
【输出格式】
对于每个测试用例,在一行中输出一个整数,表示取模 998244353 的答案。
【输入样例】
2
4 3 2
1 2 3 4
4 2 1
1 1 2 2
【输出样例】
3
2
【数据范围】
1≤T≤20
1≤k≤n≤5000,1≤r≤1e9
1≤a1≤a2≤...≤an≤1e9
【算法分析】
有 n 个套娃,大小为 a1 ≤a2 ≤... ≤an,现在要将这些套娃分成 k 组,每组套娃按照大小排序后相邻两个套娃之间的大小差距要求>=r,求方案数。
设 f[i][j] 表示将前 i 个套娃分成 j 组的方案数,状态转移方程为 f[i][j]=f[i-1][j-1](新增一组) + f[i-1][j]*max(0, j-num(z)) (第 x 的套娃跟之前的放在一组),其中 num(z) 表示 1<=z<i 且ai-r<az<=ai 的 z 的个数。时间复杂度为O(n^2)。
【算法代码】
HDU() 不支持万能头文件。
【参考文献】

浙公网安备 33010602011771号