CSP-J 2024 T4 接龙【题解】

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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值