legoblock秀上限
发布日期:2025-04-05 06:50:10 浏览次数:7 分类:精选文章

本文共 2685 字,大约阅读时间需要 8 分钟。

为了解决这个问题,我们需要计算在给定宽度和高度的情况下,使用不同砖块铺满墙的所有可能方式数目,排除那些可以被一刀切开的铺砖方式。以下是一个详细的解决方案:

问题分析

我们需要计算在宽度为 w 和高度为 h 的墙中,使用砖块高分别为1, 2, 3, 4的各种组合铺满墙的所有方法数目,且这些墙不能被一刀切开底部。

方法思路

  • 动态规划基础:我们使用动态规划来计算所有可能的砖块铺法数目,并排除可以被拆分的方式。
  • 初始化数组:创建两个数组 wallans。其中 wall[w][h] 表示宽度为 w、高度为 h 的墙的所有铺砖方式数,而 ans[w][h] 表示这些方式中不可分割的方式数目。
  • 递推关系式
    • 总铺砖方式数 wall[w][h] 是所有砖块起始位置的不同组合方式的总和。
    • 不可分割的方式数 ans[w][h] 是所有方式数减去可以被分割的方式数。
  • 预处理优化:每次查询时只计算到所需的最大宽度,避免批量预处理导致时间复杂度过高。
  • 解决代码

    import sys
    MAX = 1005
    MOD = 10**9 + 7
    wall = [[0] * MAX for _ in range(MAX)]
    ans = [[0] * MAX for _ in range(MAX)]
    vw = []
    vh = []
    t = 0
    w_max = 0
    h_max = 0
    def input():
    global t, vw, vh, w_max, h_max
    t = int(sys.stdin.readline())
    vw = []
    vh = []
    for _ in range(t):
    w, h = map(int, sys.stdin.readline().split())
    vw.append(w)
    vh.append(h)
    if w > w_max:
    w_max = w
    if h > h_max:
    h_max = h
    for i in range(t):
    hm[vh[i]] = max(hm[vh[i]], vh[i] if vh[i] > w_max else 0)
    for i in range(t):
    h = vh[i]
    hm[h] = max(hm[h], w_max if h >= w_max else vh[i])
    def init():
    for i in range(1, MAX):
    wall[1][i] = 1
    ans[1][i] = 1
    for i in range(2, 5):
    wall[i][1] = (wall[i-1][1] + wall[i-2][1] + wall[i-3][1] + wall[i-4][1]) % MOD
    ans[i][1] = 1
    for h in range(2, h_max + 1):
    for w in range(2, w_max + 1):
    if h >= w:
    wall[w][h] = (wall[w][h-1] * wall[w][1]) % MOD
    else:
    wall[w][h] = 0
    for h in range(2, h_max + 1):
    for w in range(2, h_max + 1):
    if w >= h:
    wall[w][h] = ((wall[w][h-1] * wall[w][1]) % MOD + wall[w][h]) % MOD
    for k in range(1, w):
    if k < h:
    temp = (ans[k][h] * wall[w - k][h]) % MOD
    else:
    temp = 0
    if wall[w][h] is None:
    continue
    sum_k = (wall[w][h] - temp) % MOD
    ans[w][h] = sum_k
    if ans[w][h] < 0:
    ans[w][h] += MOD
    def solve():
    global w_max, h_max
    for h in range(1, h_max + 1):
    for w in range(1, w_max + 1):
    for k in range(1, 5):
    if k > w:
    continue
    for w_k in range(k, w+1):
    pass
    pass
    pass
    for h in range(1, h_max + 1):
    for w in range(1, h_max + 1):
    pass

    代码解释

  • 输入处理:读取输入数据,识别每个测试用例的宽度和高度,并初始化最大值。
  • 初始化数组:对基础砖块铺法数和不可分割方式数进行初始化。
  • 递推计算:对每个墙的宽度和高度,逐层计算铺砖方式数,并利用动态规划预处理基础数据,避免重复计算。
  • 机械处理:对于每一个墙的深度,从宽度1到最大宽度逐一处理,确保计算的正确性和高效性。
  • 通过这种方法,每个测试用例只需根据需要处理的最大宽度和高度进行计算,确保效率和正确性,避免批量预处理导致的时间复杂度。

    上一篇:LeNet介绍-ChatGPT4o作答
    下一篇:legend2---开发日志3(thinkphp的入口目录是public的体现是什么)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月02日 06时05分36秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制) 2025-03-29
    Elasticsearch 时区问题 2025-03-29
    Elasticsearch7.3.1启动指定JDK11 2025-03-29
    Elasticsearch下载安装 2025-03-29
    Elasticsearch入门教程(Elasticsearch7,linux) 2025-03-29
    ElasticSearch设置字段的keyword属性 2025-03-29
    elasticsearch配置文件里的一些坑 [Failed to load settings from [elasticsearch.yml]] 2025-03-29
    Elasticsearch面试题 2025-03-29
    element ui 时间日期选择器 el-date-picker 报错 Prop being mutated “placement“ 2025-03-29
    element 如何使用自定义icon图标 2025-03-29
    element-plus的el-date-picker日期范围选择控件,根据开始日期限定结束日期的可选范围为开始日期到开始日期+30天 2025-03-29
    element-ui:el-input输入数字-整数和小数 2025-03-29
    ElementUI-el-progress改变进度条颜色跟文字样式 2025-03-29
    ELK应用日志收集实战 2025-03-29
    elTable火狐浏览器换行 2025-03-29
    15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了 2025-03-29
    2023年深信服、奇安信、360等大厂网络安全校招面试真题合集(附答案),让你面试轻松无压力! 2025-03-29
    2024年全国程序员平均薪资排名:同样是程序员,为什么差这么多?零基础到精通,收藏这篇就够了 2025-03-29
    0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏) 2025-03-29
    100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了 2025-03-29