刷题笔记 融合目标计算问题 题解 | 豆包MarsCode AI刷题

1 阅读4分钟

问题描述

小F正在开发一个推荐系统,该系统使用多个模型来预估不同的目标指标(如点击率和观看时长)。为了有效地融合这些指标,系统对每个目标提供了两种不同的变换方式,每种方式会产生一个变换值。小F的任务是为每个目标选择其中一种变换方式,然后将所有选中的变换值相乘,得到最终的融合结果。

然而,不同的选择组合可能会导致最终结果值过大或过小。因此,小F希望计算出在给定的合理区间 [L,R][L,R] 内,有多少种不同的选择组合可以使最终的融合结果落在这个区间内。

输入说明

  • n:目标指标的数量
  • f:一个二维数组,其中 f[i] 表示第 i 个目标的两种变换值
  • L:期望结果的下界
  • R:期望结果的上界

取值范围

  • 1 ≤ n ≤ 20
  • 1 ≤ f[i][j] ≤ 10^9
  • 1 ≤ L ≤ R ≤ 10^9

输出说明

输出一个整数,表示使最终融合结果落在区间 [L,R][L,R] 内的选择组合数量。

题目理解

小F的任务是为每个目标选择其中一种变换方式,然后将所有选中的变换值相乘,得到最终的融合结果。我们需要计算出在给定的合理区间 [L,R] 内,有多少种不同的选择组合可以使最终的融合结果落在这个区间内。

数据结构选择

根据题目分析我们可以选择以下的数据结构

  • 输入

    • n:目标指标的数量。
    • f:一个二维数组,其中 f[i] 表示第 i 个目标的两种变换值。
    • L:期望结果的下界。
    • R:期望结果的上界。
  • 输出

    • 一个整数,表示使最终融合结果落在区间 [L,R] 内的选择组合数量。

算法步骤

  1. 初始化计数器

    • 使用一个变量 count 来记录满足条件的组合数量。
  2. 递归遍历所有组合

    • 使用深度优先搜索(DFS)来遍历所有可能的组合。
    • 对于每个目标,有两种选择(选择第一种变换值或第二种变换值),因此需要递归地处理这两种选择。
  3. 递归终止条件

    • 当遍历完所有目标时(即 index == n),检查当前乘积是否在区间 [L,R] 内。
    • 如果在区间内,则增加计数器 count
  4. 递归调用

    • 递归调用 dfs 函数来处理当前目标的两种变换值。

总结收获

通过解决这个推荐系统中的组合选择问题,我深刻体会到了递归在处理组合问题中的强大作用。递归不仅能够帮助我们系统地遍历所有可能的组合,还能在每一步中进行条件判断,从而高效地筛选出满足特定条件的组合。在这个过程中,我学会了如何通过递归函数来构建复杂的逻辑结构,并且在递归终止时进行结果的汇总和判断。此外,我还意识到了在处理大规模组合问题时,时间复杂度的考量至关重要。尽管递归方法在处理小规模问题时表现出色,但在面对更大规模的数据时,可能需要考虑更优化的算法或数据结构来提高效率。总的来说,这次练习不仅提升了我的编程技能,也让我对算法设计和复杂度分析有了更深入的理解。

代码

def solution(n: int, f: list[list[int]], L: int, R: int) -> int:
    # 初始化计数器
    count = 0
    
    # 定义递归函数来遍历所有组合
    def dfs(index, current_product):
        # 如果已经遍历完所有目标
        if index == n:
            # 检查当前乘积是否在区间 [L, R] 内
            if L <= current_product <= R:
                nonlocal count
                count += 1
            return
        
        # 递归遍历当前目标的两种变换值
        dfs(index + 1, current_product * f[index][0])
        dfs(index + 1, current_product * f[index][1])
    
    # 从第一个目标开始递归
    dfs(0, 1)
    
    return count

if __name__ == "__main__":
   
    print(solution(3, [[1, 2], [3, 4]], 1, 6))  
    print(solution(2, [[1, 2], [3, 4]], 4, 6))  
    print(solution(3, [[1, 2], [3, 5], [2, 4]], 10, 50))