
legoblock秀上限
动态规划基础:我们使用动态规划来计算所有可能的砖块铺法数目,并排除可以被拆分的方式。 初始化数组:创建两个数组 递推关系式: 预处理优化:每次查询时只计算到所需的最大宽度,避免批量预处理导致时间复杂度过高。 输入处理:读取输入数据,识别每个测试用例的宽度和高度,并初始化最大值。 初始化数组:对基础砖块铺法数和不可分割方式数进行初始化。 递推计算:对每个墙的宽度和高度,逐层计算铺砖方式数,并利用动态规划预处理基础数据,避免重复计算。 机械处理:对于每一个墙的深度,从宽度1到最大宽度逐一处理,确保计算的正确性和高效性。
发布日期:2025-04-05 06:50:10
浏览次数:7
分类:精选文章
本文共 2685 字,大约阅读时间需要 8 分钟。
为了解决这个问题,我们需要计算在给定宽度和高度的情况下,使用不同砖块铺满墙的所有可能方式数目,排除那些可以被一刀切开的铺砖方式。以下是一个详细的解决方案:
问题分析
我们需要计算在宽度为 w
和高度为 h
的墙中,使用砖块高分别为1, 2, 3, 4的各种组合铺满墙的所有方法数目,且这些墙不能被一刀切开底部。
方法思路
wall
和 ans
。其中 wall[w][h]
表示宽度为 w
、高度为 h
的墙的所有铺砖方式数,而 ans[w][h]
表示这些方式中不可分割的方式数目。- 总铺砖方式数
wall[w][h]
是所有砖块起始位置的不同组合方式的总和。 - 不可分割的方式数
ans[w][h]
是所有方式数减去可以被分割的方式数。
解决代码
import sysMAX = 1005MOD = 10**9 + 7wall = [[0] * MAX for _ in range(MAX)]ans = [[0] * MAX for _ in range(MAX)]vw = []vh = []t = 0w_max = 0h_max = 0def 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] += MODdef 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
代码解释
通过这种方法,每个测试用例只需根据需要处理的最大宽度和高度进行计算,确保效率和正确性,避免批量预处理导致的时间复杂度。
发表评论
最新留言
不错!
[***.144.177.141]2025年05月02日 06时05分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
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面试题
2025-03-29
element 如何使用自定义icon图标
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
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
2025-03-29
100个电脑常用组合键大全(非常详细)零基础入门到精通,收藏这篇就够了
2025-03-29