P1004 方格取数(洛谷)DP-动态规划问题-python实现

题目

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

输入输出

得到

讲解

这题,是四维动规的模板题,我们考虑两个人同时走,就相当于数字三角形。状态转移方程为:

f[i][j][k][l]=max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];f[i][j][k][l]=max(f[i−1][j][k−1][l],f[i−1][j][k][l−1],f[i][j−1][k−1][l],f[i][j−1][k][l−1])+a[i][j]+a[k][l];

不过要判断i=k&&j=l的情况。

完整代码如下:

代码

num = int(input())
qt = []
a, b, c = 1, 1, 1
while a or b or c:
    a, b, c = map(int, input().split())
    d = [a, b, c]
    qt.append(d)
wz = [[0 for i in range(num+1)]for j in range(num+1)]
sd = [[[[0for i in range(12)]for j in range(12)]for k in range(12)]for l in range(12)]
for i in qt:
    wz[i[0]][i[1]] = i[2]
for i in range(1, num+1):
    for j in range(1, num+1):
        for k in range(1, num+1):
            for l in range(1, num+1):
                sd[i][j][k][l] = max(sd[i-1][j][k-1][l], sd[i][j-1][k-1][l], sd[i][j-1][k][l-1], sd[i-1][j][k][l-1])+wz[i][j]+wz[k][l]
                if i == k and j == l:
                    sd[i][j][k][l] -= wz[i][j]
print(sd[num][num][num][num])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值