当前位置:首页 > 洛谷 > 洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)

9个月前 (06-18)

洛谷2789题解:直线交点数的递归求解与优化(附代码详解)  递归算法 动态规划 组合数学 第1张


一、题目解读

洛谷2789题要求计算n条直线在平面上两两相交时产生的不同交点数量。题目强调“不同”交点,需排除重复情况。解题关键在于如何高效枚举所有可能的交点组合,并避免重复计数。

二、解题思路

参考代码采用递归算法,核心思想是分组枚举平行线:将n条直线分为若干平行线组,每组内部无交点,组与组之间产生交点。通过递归搜索所有分组可能性,计算交点总数。为避免重复,使用vis数组标记已出现的交点数,仅统计未出现的值。

三、解题步骤

1. 初始化:定义vis数组标记交点数,ans记录不同交点数量。

2. 递归函数DFS

参数now为剩余直线数,sum为当前累计交点数。

当now=0时,若sum未被标记,则新增ans并标记。

循环枚举当前平行线组直线数i(1≤i≤now),计算交点数i*(now-i),递归处理剩余now-i条直线。

3. 主函数:输入n,初始化后调用dfs(n,0),输出ans。

四、代码与注释

#include <iostream>
#include <cstring>
using namespace std;

const int MAXN = 25; // 最大直线数
const int MAXS = 300; // 最大可能交点数

bool vis[MAXS]; // 标记已出现的交点数
int n, ans = 0;

// 递归搜索所有可能的交点数
// now: 剩余需要分配的直线数
// sum: 当前累计的交点数
void dfs(int now, int sum) {
    if (now == 0) { // 所有直线已分配完毕
        if (!vis[sum]) { // 如果这个交点数未出现过
            vis[sum] = true;
            ans++;
        }
        return;
    }
    
    // 枚举当前平行线组的直线数i
    for (int i = 1; i <= now; i++) {
        // 当前i条平行线与其他now-i条直线产生i*(now-i)个交点
        // 递归处理剩余的now-i条直线
        dfs(now - i, sum + i * (now - i));
    }
}

int main() {
    cin >> n;
    memset(vis, false, sizeof(vis));
    dfs(n, 0); // 初始状态:n条直线待分配,0个交点
    cout << ans << endl;
    return 0;
}

五、总结

本解法通过递归枚举平行线分组,结合标记数组避免重复,巧妙解决了交点计数问题。时间复杂度受递归深度和标记数组大小影响,适用于小规模数据(如n≤25)。对于更大规模问题,可探索动态规划组合数学优化。理解递归搜索的逻辑和去重技巧,有助于解决类似组合计数问题。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣746:三步通关最小花费爬楼梯

力扣746:三步通关最小花费爬楼梯

题目解析:站在楼梯的某个台阶时,需要支付当前台阶对应的体力值cost[i],之后可以选择向上爬1或2个台阶。最终目标是到达‌楼层顶部‌(即数组末尾之后的位置),且初始位置可选择下标0或1的台阶作为起点...

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

力扣1137题:动态规划解泰波那契数 高效求解第N项的秘密

一:重新解读题目泰波那契数列是一个充满数学趣味的递推序列:从第3项开始,每个数均为前三个数的和(即Tₙ₊₃ = Tₙ + Tₙ₊₁ + Tₙ₊₂)。当给定整数n时,需要高效计算出第n项的值。面对此类递...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

力扣450题:删除二叉搜索树中的节点 - 递归解法详解

力扣450题:删除二叉搜索树中的节点 - 递归解法详解

内容简介本文详细解析了力扣450题"删除二叉搜索树中的节点"的递归解法。通过递归遍历二叉搜索树并根据不同情况处理节点删除操作,实现了BST节点的精确删除。文章包含完整注释代码、算法...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

NOIP 2008火柴棒等式题解(C++代码实现)  动态规划与枚举算法详解

NOIP 2008火柴棒等式题解(C++代码实现) 动态规划与枚举算法详解

一、题目解读火柴棒等式问题(NOIP 2008,洛谷P1149)要求使用给定数量的火柴棒,构造形如 A + B = C 的等式,其中A、B、C均为整数,且火柴棒总数恰好等于输入值。需统计符合条件的等式...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。