青训营笔记创作活动

52 阅读2分钟

问题描述 给定一个包含 N 个整数的数组 A,其中每个元素编号从 0 到 N-1,并且一个整数 K。数组 A 的每个元素都在 1 到 K 的范围内。

定义一个长度为 N 的数组 B 为好数组,如果它满足以下条件:

每个元素 B[i] 都在 1 到 K 的范围内。 对于所有从 0 到 N-2 的索引 i,满足 B[i] + B[i+1] = A[i] + A[i+1]。 你的任务是计算满足上述条件的好数组的总数。

测试样例 样例1:

输入:N = 3, K = 2, A = [1, 2, 1] 输出:2

样例2:

输入:N = 4, K = 3, A = [1, 3, 2, 1] 输出:1

样例3:

输入:N = 2, K = 1, A = [1, 1] 输出:1

要解决这个问题,可以逐步构建符合条件的数组 B,并利用动态规划或者递归的方式来计算符合条件的好数组的总数。* 思路解析 好数组定义: 对于数组 B,每个元素 B[i] 都在 1 到 K 范围内。 对于每一对相邻元素 B[i] 和 B[i+1],要求 B[i] + B[i+1] 等于 A[i] + A[i+1]。 数组 B 的构造:

通过逐个推算 B[i] 和 B[i+1],我们可以确保相邻元素的和等于 A[i] + A[i+1]。 对于每个 i,我们可以计算 B[i+1] 的可能值,并保持条件成立。 状态转移: 定义一个二维数组 dp[i][x],表示在位置 i 时,B[i] 为 x 时的有效数量。 对于 dp[i][x],从位置 i-1 推导到位置 i,只要满足 B[i-1] + B[i] = A[i-1] + A[i],就可以增加相应的计数。 解法步骤 初始化 dp[0][x],其中 x 从 1 到 K。 遍历每个位置 i,更新 dp[i] 使得每一对相邻元素的和符合要求。 最后,累加 dp[N-1][x] 的结果,得到最终的符合条件的好数组数量。 代码实现 解释 dp[i][x]:

dp[i][x] 表示在位置 i 时,B[i] 为 x 的情况下,符合条件的数组的数量。 初始化:

初始时,dp[0][x] 为 1,因为第一个元素 B[0] 可以是 1 到 K 的任意一个值。 状态转移:

对于每个位置 i,我们根据 A[i-1] + A[i] 的和,计算出每个可能的 B[i] 值,从而更新 dp[i][x]。 最终结果:

结果是所有 dp[N-1][x] 的和,表示在最后一个位置时,所有可能的好数组数量。 时间复杂度 初始化 dp[0][x] 是 O(K),每一轮更新 dp[i] 需要 O(K^2),总的时间复杂度是 O(N * K^2)。 测试样例 输入:N = 3, K = 2, A = [1, 2, 1]

输出:2 输入:N = 4, K = 3, A = [1, 3, 2, 1]

输出:1 输入:N = 2, K = 1, A = [1, 1]

输出:1