RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1600981
Accepted
Alisher
Alisher
Asked:2024-11-27 16:42:49 +0000 UTC2024-11-27 16:42:49 +0000 UTC 2024-11-27 16:42:49 +0000 UTC

如何解决问题 915.Cube - 2 acmp?

  • 772

https://acmp.ru/index.asp?main=task&id_task=915

我尝试解决这个问题的方法如下:

N, M = map(int, input().split())
field = [[] for _ in range(N)]
for i in range(N):
    field[i] = list(map(int, input().split()))

dp = [[[-float('inf')] * 7 for _ in range(M)] for _ in range(N)]

for k in range(1, 7):
    dp[0][0][k] = k * field[0][0]
adjacent_faces = {
    1: (2, 3, 4, 5),
    2: (1, 3, 4, 6),
    3: (1, 2, 5, 6),
    4: (1, 2, 5, 6),
    5: (1, 3, 4, 6),
    6: (2, 3, 4, 5)
}

for i in range(N):
    for j in range(M):
        for k in range(1, 7):

            if i + 1 < N:
                for face in adjacent_faces[k]:
                    dp[i + 1][j][face] = max(dp[i + 1][j][face], dp[i][j][k] + face * field[i + 1][j])

            if j + 1 < M:
                for face in adjacent_faces[k]:
                    dp[i][j + 1][face] = max(dp[i][j + 1][face], dp[i][j][k] + face * field[i][j + 1])
result = max(dp[N - 1][M - 1][k] for k in range(1, 7))
print(result)

卡在测试用例 34 上(超出时间限制),请帮助我优化我的代码,或者如果您向我展示另一个解决方案,我会很高兴


首先,我遍历了立方体的所有面以获得最大索引号(0,0)

for k in range(1, 7):
    dp[0][0][k] = k * field[0][0]

然后我打开地图,在其中指示立方体每一面的邻居:

adjacent_faces = {
    1: (2, 3, 4, 5),
    2: (1, 3, 4, 6),
    3: (1, 2, 5, 6),
    4: (1, 2, 5, 6),
    5: (1, 3, 4, 6),
    6: (2, 3, 4, 5)
}

在这个问题中,我需要通过将立方体滚动到相邻边来最大化总和,即,cube_side*number(x,y) 然后我需要从 (0,0) 到 (N-1,M-1) ,但我只能向下向右对获得的值进行求和。在循环内我查看立方体的所有面

for k in range(1,7)

然后我尝试与邻居的所有可能的组合以最大化总和

for face in adjacent_faces[k]

然后我总结所有的值

抱歉没有立即解释所有内容。

我尝试了这种方法,但在测试用例 33 上失败了

from collections import deque

N, M = map(int, input().split())
field = [list(map(int, input().split())) for _ in range(N)]

adjacent_faces = {
    1: (2, 3, 4, 5),
    2: (1, 3, 4, 6),
    3: (1, 2, 5, 6),
    4: (1, 2, 5, 6),
    5: (1, 3, 4, 6),
    6: (2, 3, 4, 5),
}
dp = [[[-float('inf')] * 7 for _ in range(M)] for _ in range(N)]

queue = deque()

for k in range(1, 7):
    dp[0][0][k] = k * field[0][0]
    queue.append((0, 0, k))

while queue:
    x, y, k = queue.popleft()
    for dx, dy in ((1, 0), (0, 1)):
        nx, ny = x + dx, y + dy
        if 0 <= nx < N and 0 <= ny < M:
            for face in adjacent_faces[k]:
                new_value = dp[x][y][k] + face * field[nx][ny]
                if new_value > dp[nx][ny][face]:
                    dp[nx][ny][face] = new_value
                    queue.append((nx, ny, face))
print(max(dp[N - 1][M - 1]))

python
  • 1 1 个回答
  • 103 Views

1 个回答

  • Voted
  1. Best Answer
    Stanislav Volodarskiy
    2024-11-29T04:51:34Z2024-11-29T04:51:34Z

    第一次也是最后一次用 Python 传递这个任务是在 2019 年。难的。

    内存限制要求逐行处理该字段。时间限制需要优化最大值的计算(两个相对的双方沿着分隔它们的单元“带”使用共同的最大值。

    def main():
        belts = (1, 2, 3, 4), (0, 2, 3, 5), (0, 1, 4, 5)
        cube = 0, 1, 2, 2, 1, 0
    
        n, m = map(int, input().split())
    
        def maxes(g):
            s = tuple(g)
            return [max(s[f] for f in faces) for faces in belts]
    
        mx = [[0] * 3] * m
    
        row = list(map(int, input().split()))
    
        mx[0] = maxes((p + 1) * row[0] for p in range(len(cube)))
    
        for j in range(1, m):
            mx[j] = maxes(
                (p + 1) * row[j] + mx[j - 1][b] for p, b in enumerate(cube)
            )
    
        for _ in range(1, n):
            row = list(map(int, input().split()))
    
            mx[0] = maxes(
                (p + 1) * row[0] + mx[0][b] for p, b in enumerate(cube)
            )
    
            for j in range(1, m):
                mx[j] = maxes(
                    (p + 1) * row[j] + max(mx[j][b], mx[j - 1][b])
                    for p, b in enumerate(cube)
                )
    
        print(max(mx[m - 1]))
    
    
    main()
    

    如果继续重构代码,可以获得三倍的速度提升:

    def main():
        n, m = map(int, input().split())
    
        mx0 = [0] + [float('-inf')] * m
        mx1 = mx0[:]
        mx2 = mx1[:]
    
        for _ in range(n):
            for j, a in enumerate(map(int, input().split())):
                s0 = (1, 6)[a > 0] * a + max(mx0[j - 1], mx0[j])
                s1 = (2, 5)[a > 0] * a + max(mx1[j - 1], mx1[j])
                s2 = (3, 4)[a > 0] * a + max(mx2[j - 1], mx2[j])
                mx0[j] = max(s1, s2)
                mx1[j] = max(s2, s0)
                mx2[j] = max(s0, s1)
    
        print(max(mx0[m - 1], mx1[m - 1], mx2[m - 1]))
    
    
    main()
    
    • 1

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5