CSP-J 2024 T4 接龙
题目大意
小 J 要进行一场 n 个人玩的接龙游戏,游戏的规则和定义如下:
- 每个人都有自己的词库。
- 游戏分为若干轮接龙,一个人连着接龙若干个词语算一轮,相邻两轮接龙不能由同一人完成。
- 第一轮必须从 1 开始接龙,其他情况必须从上一轮的最后一个数开始接龙。
- 每个人接龙都只能从自己的词库选择长度为 1 ~ k 的连续子序列接龙。
- 示例:
- 词库:[1, 2, 3, 5, 4]
- 上一轮结尾:2
- k = 2时可选子序列:
[2] (长度1)
[2,3] (长度2)
现在求能否接龙 r 轮,最后以 c 结尾。
输入样例解释
1 // 数据组数
3 3 7 // 人数 接龙序列长度上限(k) 询问次数
5 1 2 3 4 1 // 第 1 个人的词库
3 1 2 5 // 第 2 个人的词库
3 5 1 6 // 第 3 个人的词库
1 2 // 询问接龙 1 轮、以 2 结尾能否实现
......
解题思路
本文的解题思想为dp。
dp[r][x]:接龙 r 轮、以 x 结尾的状态:
dp[r][x]= -1:不可实现。dp[r][x]= i(一个自然数):可以通过词库 i 实现(最后一次接龙操作使用的是词库 i 中的某个连续子序列)。dp[r][x]= -2:可以通过多个词库实现。
代码解析
完整的求解部分:
vector<vector<int> > Solve(int mx) {
vector<vector<int> > dp(R, vector<int>(mx + 5, -1));
dp[0][1] = -2;
for (int r = 1; r <= 100; r++) {
for (int i = 1; i <= n; i++) {
int lst = -1;
for (int j = 0; j < s[i].size(); j++) {
int tmp = s[i][j];
if

最低0.47元/天 解锁文章
779

被折叠的 条评论
为什么被折叠?



