10.矩形覆盖

矩形覆盖

题目链接

题目描述

我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

比如n=3时,2*3的矩形块有3种覆盖方法:

img

记忆化搜索

思路与前面的递归题目一样。

时间复杂度O(n)。

class Solution {
public:t
    int f[40];
    int rectCover(int number) {
        if (number <= 2)
        {
        		return number;
        }
        if (f[number] != 0)
        {
            return f[number];
        }
        return f[number] = rectCover(number - 1) + rectCover(number - 2);
    }
};

运算简化

class Solution {
public:
    int rectCover(int number) {
        if (number <= 2)
        {
        		return number;
        }
        int f0 = 1;
        int f1 = 2;
        for (int i = 3; i <= number; ++i)
        {
            int tmp = f1;
            f1 = f0 + f1;
            f0 = tmp;
        }
        return f1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
覆盖矩形问题是一个经典的最小化重叠面积的问题。解决这个问题需要一些几何知识和编程技巧。 首先,我们需要找到一种可以表示圆和矩形的方法。常用的方法是使用圆心和半径表示圆,使用左上角和右下角坐标表示矩形。在Python中,我们可以使用tuple或者list表示点的坐标,例如(0,0)表示坐标系原点。 接下来,我们需要找到圆覆盖矩形的方法。可以发现,圆覆盖矩形当且仅当圆心在矩形内部或者边界上。因此,我们可以先判断圆心是否在矩形内部,如果不是,再计算圆心到矩形边界的距离,如果距离小于等于半径,那么圆覆盖矩形。 最后,我们需要找到最小重叠面积。一个简单的方法是枚举所有可能的圆心和半径,计算圆覆盖矩形的面积,并找到最小值。这种方法时间复杂度较高,因此我们可以使用一些优化方法,例如二分搜索和贪心算法。 下面是一个示例代码: ```python import math # 计算两个点之间的距离 def distance(p1, p2): return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2) # 判断圆心是否在矩形内部 def is_inside(center, rect): if center[0] < rect[0][0] or center[0] > rect[1][0]: return False if center[1] < rect[0][1] or center[1] > rect[1][1]: return False return True # 计算圆覆盖矩形的面积 def overlap_area(center, radius, rect): if is_inside(center, rect): return (rect[1][0]-rect[0][0])*(rect[1][1]-rect[0][1]) else: # 计算圆心到矩形边界的距离 dist = [] dist.append(center[0]-rect[0][0]) # 左边界 dist.append(rect[1][0]-center[0]) # 右边界 dist.append(center[1]-rect[0][1]) # 上边界 dist.append(rect[1][1]-center[1]) # 下边界 # 计算最小距离 min_dist = min(dist) if min_dist > radius: # 不重叠 return 0 else: # 计算重叠面积 d = 2*math.sqrt(radius**2 - min_dist**2) w = min(rect[1][0], center[0]+d/2) - max(rect[0][0], center[0]-d/2) h = min(rect[1][1], center[1]+d/2) - max(rect[0][1], center[1]-d/2) return w*h # 求解最小重叠面积 def min_overlap_area(rects): # 初始化半径的范围 min_radius = 0 max_radius = 0 for rect in rects: max_radius = max(max_radius, distance(rect[0], rect[1])/2) # 二分搜索 while max_radius-min_radius > 1e-10: mid_radius = (min_radius+max_radius)/2 min_area = float("inf") for i in range(len(rects)): for j in range(i, len(rects)): center = ((rects[i][0][0]+rects[j][1][0])/2, (rects[i][0][1]+rects[j][1][1])/2) area = overlap_area(center, mid_radius, (rects[i][0], rects[j][1])) min_area = min(min_area, area) if min_area == 0: min_radius = mid_radius else: max_radius = mid_radius return min_area # 测试代码 rects = [((0,0), (2,2)), ((1,1), (3,3)), ((2,2), (4,4))] print(min_overlap_area(rects)) # 输出1.0 ``` 在上面的代码中,我们使用了二分搜索来找到最小重叠面积。由于涉及浮点数比较,因此需要设置一个很小的精度来避免精度误差。在测试代码中,我们定义了三个矩形,它们的交集组成了一个正方形,因此最小重叠面积为1.0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值