CSP-最大的矩形Python实现

问题描述
  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
在这里插入图片描述
  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
 在这里插入图片描述

输入格式
  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3
样例输出
10
思路:最近算法课刚学了动态规划,刚看到这道题就想着用动态规划做,做完之后发现不需要动态规划就可以,只需要计算出各个矩形之间的最小高度,填入二维列表中,然后分别计算面积,选出最大的就可以,下面贴上代码。

n = int(input())
nums = list(map(int,input().split()))
# 如果只有一个矩形直接输出
if n == 1:
    print(nums[0])
else:
    # 存放最大的矩形面积
    max_s = 0
    # 存放俩个矩形之间的最低高度
    temp = [[0]*n for i in range(n)]
    # 初始化
    for i in range(n):
        temp[i][i] = nums[i]
    # 计算俩个矩形间的最低高度
    for i in range(n-1):
        # 只需要初始化上三角
        for j in range(i+1,n):
            # 防止出现单个矩阵的面积就是最大面积的情况,不过不加也可以100分,可能测试数据没有这种情况
            max_t = max(temp[i][i],temp[j][j])
            temp[i][j] = min(temp[i][j-1],nums[j])
            t_s = (j-i+1)*temp[i][j]
            # 更新最大的矩形面积
            max_s = max(max_s,t_s,max_t)
    print(max_s)

第一次做的用动态规划的也贴上吧也是可以100分通过的,虽然多此一举了,就当练习了。

n = int(input())
nums = list(map(int,input().split()))
if n == 1:
    print(nums[0])
else:
    # 创建表格
    dp = [[0]*n for i in range(n)]
    # 存放俩个矩形之间的最低高度
    temp = [[0]*n for i in range(n)]
    # 初始化
    for i in range(n):
        dp[i][i] = nums[i]
        temp[i][i] = nums[i]
    # 先计算最低高度
    for i in range(n-1):
        # 只需要初始化上三角
        for j in range(i+1,n):
            temp[i][j] = min(temp[i][j-1],nums[j])

    def judge(i,j):
        return max(dp[i][j-1],dp[i+1][j],(j-i+1)*temp[i][j])
    i = 0
    j = 1
    k = 1
    # 填表格,只需要填充上三角,按照主对角线向右上方填充
    while j > i:
        if i < n-k:
            dp[i][j] = judge(i,j)
            i += 1
            j += 1
        else:
            i = 0
            k += 1
            j = k
        # 填充到右上角元素,跳出
        if i == 0 and j == n-1:
            dp[i][j] = judge(i,j)
            break
    print(dp[0][n-1])

最后贴上提交截图,感觉时间复杂度好像还是有点高,另外博主也是算法基础比较薄弱的,这学期算法课有组织的CSP考试所以想记录刷模拟题的过程,这些解题思路也都是自己想到的,可能不是最优的解法,如果对大家有帮助的话就更好啦,希望可以慢慢变强叭~~
在这里插入图片描述
第一次是用动态规划的,第二次把动态规划取了,时间复杂度差不多少了一半,但是少考虑了一种单个矩形面积可能就是最大的情况(注释中有写明,不过也可以100分通过,应该是测试数据中没有这种情况),第三次是将这种情况也考虑进去之后的(时间又上去了…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值