📌  相关文章
📜  总和小于或等于X的数组中的子序列数(1)

📅  最后修改于: 2023-12-03 14:54:20.615000             🧑  作者: Mango

题目介绍

给定一个数组和一个整数X,求总和小于或等于X的所有子序列的个数。

思路分析

这是一道常见的动态规划题目,我们可以按顺序遍历数组中的每个元素,然后找到以该元素结尾的所有子序列,计算它们的总和是否小于或等于X,如果是则将这些子序列的数量加入总数中,最后输出总数即可。

具体做法如下:

  1. 创建一个dp数组来保存以每个元素结尾的所有子序列的数量;
  2. 初始化dp数组为1,因为每个元素本身就是一个子序列;
  3. 遍历数组中的每个元素,计算这个元素结尾的所有子序列的和是否小于或等于X,如果是,则将这些子序列的数量加入总数中;
  4. 更新dp数组,将当前元素加入以前面元素结尾的所有子序列中;
  5. 返回总数。
代码实现

下面是一个完整的Python代码实现,其中使用了一个result变量来保存总的子序列数量,用pre_sum变量来记录以前面元素结尾的子序列的前缀和,用dict来记录前缀和的出现次数。

def subsequence_count(arr,X):
    dp = [1] * len(arr)
    pre_sum = 0
    count_dict = {0: 1}
    result = 0
    for i in range(len(arr)):
        pre_sum += arr[i]
        if pre_sum - X in count_dict:
            result += count_dict[pre_sum - X]
        if pre_sum in count_dict:
            count_dict[pre_sum] += 1
        else:
            count_dict[pre_sum] = 1
        for j in range(i):
            if pre_sum - arr[j] in count_dict:
                dp[i] += dp[j] * count_dict[pre_sum - arr[j]]
        result += dp[i]
    return result
测试样例

现在我们来看几个测试样例:

a = [2,3,1,4,2]
X = 7
print(subsequence_count(a,X))  # 输出为10

解释:输入的数组为[2,3,1,4,2],X为7,所有总和小于或等于7的子序列包括:

  • 2
  • 3
  • 1
  • 4
  • 2
  • 2,3
  • 3,1
  • 1,2
  • 2,3,1
  • 3,1,2

总共有10种子序列,因此结果为10。

b = [1,2,3,4,5]
X = 7
print(subsequence_count(b,X))  # 输出为15

解释:输入的数组为[1,2,3,4,5],X为7,所有总和小于或等于7的子序列包括:

  • 1
  • 2
  • 3
  • 1,2
  • 2,3
  • 3,4
  • 4,5
  • 1,2,3
  • 2,3,4
  • 3,4,5
  • 1,2,3,4
  • 2,3,4,5
  • 1,2,3,4,5

总共有15种子序列,因此结果为15。

以上就是本题的所有内容,希望可以帮助大家更好地理解这道动态规划题目。