第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

洛谷P2789題解:遞歸算法與避免重復(fù)計算的技巧

標(biāo)簽:
C++

https://img1.sycdn.imooc.com/ca9c4868085610c209320618.jpg

一、题目解读

洛谷P2789题要求计算n条直线在平面上两两相交产生的交点总数。题目强调交点不重复,需考虑平行线情况。关键点在于如何高效枚举所有可能的交点组合,并排除重复结果。

二、解题思路

采用递归算法,核心思想是“分治+标记”。通过枚举每条线与其他线的平行关系,将问题分解为子问题:当前线与其他线平行或相交。为避免重复统计,使用全局数组A标记已存在的交点数,仅当新交点数未被记录时才累加。

三、解题步骤

1. 输入处理:获取总直线数n,初始化sum=0,A数组全0。

2. 递归函数plan(p,m):

○ 终止条件:p=0时,若m未出现,更新sum并标记A[m]。

○ 递归逻辑:枚举平行线数r(p到1),计算r条平行线与剩余p-r条线的交点数r*(p-r),递归调用plan(p-r, m+r*(p-r))。

3. 主函数:调用plan(n,0),输出sum。

四、代码与注释

#include <iostream>#include <algorithm>// 全局变量int sum = 0;          // 总交点数之和int p, n, r;          // p为剩余线数,n为总直线数,r为平行线数bool A[100000] = {0}; // A[i]=1表示i个交点已存在,避免重复统计// 递归函数:计算交点数// p:剩余线数(当前待处理的线数)// m:当前已计算的交点数void plan(int p, int m) {
    // 终止条件:当剩余线数为0时,记录当前交点数
    if (p == 0) {
        if (A[m] == 0) { // 若该交点数未出现过,计入sum
            sum++;
        }
        A[m] = 1; // 标记为已存在
    } else {
        // 枚举平行线数量r(从p到1)
        for (int r = p; r >= 1; r--) {
            // 计算r条平行线与剩余p-r条线的交点数:r*(p-r)
            int newM = m + r * (p - r);
            // 递归处理剩余p-r条线
            plan(p - r, newM);
        }
    }}int main() {
    std::cin >> n; // 输入总直线数n
    plan(n, 0);    // 从n条线开始递归,初始交点数为0
    std::cout << sum << std::endl; // 输出总交点数之和
    return 0;}

五、总结

本解法巧妙利用递归将复杂枚举转化为子问题求解,结合标记数组高效去重。核心在于理解平行线产生的交点数公式r*(p-r),并通过分治策略逐层递归。时间复杂度受递归深度影响,但通过避免重复计算显著优化结果。该思路对组合数学类问题具有参考价值。

来源:信奥之路


點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學(xué)

大額優(yōu)惠券免費領(lǐng)

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消