【编程练习】小强的神器矩阵

本文探讨了一道阿里巴巴的编程题目,主要涉及动态规划的解法。作者首先分享了一个尝试使用贪心算法但失败的解法,然后详细解释了正确的动态规划思路,如何通过维护一个dp矩阵来逐步求解问题,确保找到全局最优解。文章适合对动态规划感兴趣的程序员阅读。
摘要由CSDN通过智能技术生成

题目来源:牛客,阿里巴巴编程题(2星),第7题

题目描述

在这里插入图片描述

题解

法一:错误方法🙅‍♂️
想用贪心去解,但解法是错的,代码如下:

def main():
    n = int(input())
    a1 = [int(i) for i in input().split()]
    a2 = [int(i) for i in input().split()]
    a3 = [int(i) for i in input().split()]
    l1 = [a1[0],a2[0],a3[0]]
    l2 = [a1[1],a2[1],a3[1]]
    ans,st=1e9,0
    for j in range(3):
        for k in range(3):
            if abs(l1[j]-l2[k])<ans:
                ans = abs(l1[j]-l2[k])
                st = l2[k]
    for i in range(2,n):
        tmp = min([abs(st-ai) for ai in [a1[i],a2[i],a3[i]]])
        ans += tmp
        st = a1[i] if abs(st-a1[i])==tmp else a2[i] if abs(st-a2[i])==tmp else a3[i]
    print(ans)
    return

if __name__ == '__main__':
    main()
    

法二:动态规划🙆‍♂️
这算是比较经典的动态规划题,但我竟然第一时间没往这方面想,还是得多练

动态规划的关键在于定义dp数组。这里,子问题是选择下一个使绝对值总和最小的值。但解决问题的时候反过来看,对于待选择的三个值,他们加上之前的那一组之和能够最小。最终,再从这三个值中选取最小值,这样一定能保证最优解。

def main():
    n = int(input())
    matrix = []
    for k in range(3):
        matrix.append([int(i) for i in input().split()])
    dp_matrix = [[0,0,0]]
    for i in range(1,n):
        d0 = min([abs(matrix[j][i-1]-matrix[0][i])+dp_matrix[i-1][j] for j in range(3)])
        d1 = min([abs(matrix[j][i-1]-matrix[1][i])+dp_matrix[i-1][j] for j in range(3)])
        d2 = min([abs(matrix[j][i-1]-matrix[2][i])+dp_matrix[i-1][j] for j in range(3)])
        dp_matrix.append([d0,d1,d2])
    print(min(dp_matrix[-1]))
    return

if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值