外边距合并问题及解决方案

BFC:
       边距重叠解决方案 BFC(块级格式化上下文):
         一. BFC的原理:
            内部的box会在垂直方向,一个接一个的放置
             box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的 margin会发生重叠
             bfc的区域不会与浮动区域的box重叠
             bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也 不会影响外面的
           二.创建BFC:
                    float属性不为none(脱离文档流)
                    position为absolute或fixed
                    display为inline-block,table-cell,table-caption,flex,inine-flex
                    overflow不为visible
           三.应用场景:
                    自适应两栏布局、清除浮动、防止垂直margin重叠

1. 相邻块元素垂直外边距的合并
当上下相邻的两个块元素(兄弟关系)相遇时,如果上面的元素有下外边距 margin-bottom,下面的元素有 上外边距 margin-top ,则他们之间的垂直间距不是 margin-bottom 与 margin-top 之和。而是 取两个值中的 较大者这种现象被称为相邻块元素垂直外边距的合并 。

解决方案:
尽量只给一个盒子添加 margin 值。

2. 嵌套块元素垂直外边距的塌陷
对于两个嵌套关系(父子关系)的块元素,父元素有上外边距同时子元素也有上外边距,此时父元素会塌陷较大的外边距值。 使用 margin 定义块元素的垂直外边距时,可能会出现外边距的合并。

解决方案:
① 可以为父元素定义上边框。
② 可以为父元素定义上内边距。
③ 可以为父元素添加 overflow:hidden。
 

### 动态规划中的重叠子问题及其解决方法 动态规划的核心在于利用**最优子结构**和**重叠子问题**来优化计算效率。其中,重叠子问题是动态规划的关键特性之一,它指的是在解决问题的过程中,某些子问题会被多次重复调用[^1]。 为了高效地处理这些重复的子问题,通常采用两种主要策略: #### 1. 自顶向下的记忆化搜索 通过引入一个辅助数据结构(通常是哈希表或数组),记录已经计算过的子问题的结果,在后续遇到相同子问题时直接返回已保存的结果,从而避免冗余计算。这种方法被称为记忆化搜索。 以下是基于自顶向下方式实现的一个经典例子——斐波那契数列的计算: ```python def fibonacci(n, memo={}): if n in memo: return memo[n] if n <= 1: return n memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo) return memo[n] print(fibonacci(10)) # 输出第10个斐波那契数 ``` 上述代码中,`memo`字典用于存储之前计算过的结果,有效减少了函数调用次数。 #### 2. 自底向上的迭代法 另一种常见的方式是从最简单的子问题出发逐步构建更大的解决方案,直到最终目标被完全覆盖为止。这种方式无需显式的递归调用栈支持,因此空间复杂度较低。 下面展示了一个关于连续子数组最大和的例子,该实例展示了如何运用动态规划的思想以及如何规避重复运算: ```python def max_subarray(nums): dp = [0] * len(nums) dp[0] = nums[0] for i in range(1, len(nums)): dp[i] = max(dp[i - 1] + nums[i], nums[i]) return max(dp) nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] result = max_subarray(nums) print(result) # 输出7 ``` 在此程序里,变量 `dp[i]` 表示以索引i结尾的所有可能子数组里的最大值;而状态转移方程则定义为当前元素单独成组或者加上前一位置的最佳结果两者取较大者[^2]。 对于更复杂的场景比如字符串匹配等问题,则可以考虑建立二维表格形式的状态表示来进行进一步扩展应用,例如最小编辑距离问题就采用了类似的思路[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值