1.递归方式

求最短,最终状态即右下角

f(v, i, j) = min(f(v, i - 1, j), f(v, i, j - 1)) + v[i][j]

最长只需将min改为max即可

import numpy as np
# i:行
# j:列
# v:矩阵 def f(v, i, j):
if i == 0 and j == 0:
return v[0][0]
elif i == 0:
return f(v, i, j - 1) + v[i][j]
elif j == 0:
return f(v, i - 1, j) + v[i][j]
else:
return min(f(v, i - 1, j), f(v, i, j - 1)) + v[i][j] v = np.array([[1, 3, 5, 9], [8, 1, 3, 4], [5, 0, 6, 1], [8, 8, 4, 0]])
print(f(v, 3, 3))

2.递推方式

注意到只能往右或往下,可以想象,每下一层是右方或下方,而矩阵中,可以想象是以平行与对角线方向为一层,一层层从左上角到右下角递推

即运行一半为如此:



运行完全部为如此



而一层层,每层每一单元取左或上累计最少的数加上本身

f[i][j] = min(f[i - 1]f[j], f[i]f[j - 1]) + v[i][j]

因此:代码如下:

import numpy as np
# i:行
# j:列
# v:矩阵 def f(v, n):
s = np.array([[0] * n] * n)
for p in range(n):
for i in range(p + 1):
j = p - i
if i == 0 and j == 0:
s[0][0] = v[0][0]
elif i == 0:
s[0][j] = s[0][j - 1] + v[0][j]
elif j == 0:
s[i][0] = s[i - 1][0] + v[i][0]
else:
s[i][j] = min(s[i - 1][j], s[i][j - 1]) + v[i][j]
limit = 0
for p in range(n, 2 * n - 1):
limit += 1
for i in range(limit, p - limit + 1):
j = p - i
if i == 0 and j == 0:
s[0][0] = v[0][0]
elif i == 0:
s[0][j] = s[0][j - 1] + v[0][j]
elif j == 0:
s[i][0] = s[i - 1][0] + v[i][0]
else:
s[i][j] = min(s[i - 1][j], s[i][j - 1]) + v[i][j]
return s v = np.array([[1, 3, 5, 9], [8, 1, 3, 4], [5, 0, 6, 1], [8, 8, 4, 0]])
print(f(v, 4))

最后统计出的矩阵的右下即为最少路径和(s[n-1][n-1])

而通过返回s[n-1],我们可以看到路径,从左上角开始,取每一层最小值(不可单独面对方向,可能会陷入陷阱,中途进入错误路径),代码实现如下:

def view(s, n):
string = ''
for p in range(n):
min = 0
for i in range(p + 1):
j = p - i
if min == 0:
min = s[i][j]
elif min > s[i][j]:
min = s[i][j]
string += str(min) + '->'
limit = 0
for p in range(n, 2 * n - 1):
limit += 1
min = 0
for i in range(limit, p - limit + 1):
j = p - i
if min == 0:
min = s[i][j]
elif min > s[i][j]:
min = s[i][j]
if p == (2 * n - 2):
string += str(min)
else:
string += str(min) + '->'
return string

原矩阵:



运行效果:

求矩阵最少(或最多)路径和(python实现)的更多相关文章

  1. 【python实例】要求输出字符串中最少一个最多八个的所有字符串组合(连续)

    """ 题目:字符串str="ABCDEFGHIJK",要求输出最少一个最多八个的所有组合(向后连续字母) 输出如下: A [0::] AB ABC ...

  2. 市场清仓价格算法 python求矩阵不同行不同列元素和的最大值

    问题描述 求矩阵不同行不同列元素和的最大值(最小值) 问题求解 1.通过scipy库求解 scipy.optimize库中的linear_sum_assignment方法可以求解 输入一个矩阵,参数m ...

  3. POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)

    求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...

  4. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  5. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习

    http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...

  6. MATLAB中求矩阵非零元的坐标

    MATLAB中求矩阵非零元的坐标: 方法1: index=find(a); [i,j]=ind2sub(size(a),index); disp([i,j]) 方法2: [i,j]=find(a> ...

  7. POJ 1151 Atlantis 求矩阵面积并 扫描线 具体解释

    题意: 给定n个矩阵的左下角和右上角坐标,求矩阵面积并(矩阵总是正放的,即与x轴y轴都平行) 思路: 扫描线裸题 http://www.cnblogs.com/fenshen371/p/3214092 ...

  8. 求矩阵中各列数字的和 Exercise08_01

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵中各列数字的和 * */ public class Exercise ...

  9. 求矩阵主对角线元素的和 Exercise08_02

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵主对角线元素的和 * */ public class Exercis ...

随机推荐

  1. Nginx开启Gzip压缩提升页面加载速度

    1.在 nginx 的conf 目录下新建 gzip.conf 文件 #开启gzip压缩 gzip on; #设置允许压缩的页面最小字节数 gzip_min_length 1k; #申请4个单位为16 ...

  2. 如何选择一款适合自己操作系统、Windows、Mac还是Linux?

    如何选择一款适合自己操作系统.Windows.Mac还是Linux? 作者:我们都很努力着 简介:电脑已经逐渐离不开我们生活,但是如何选择一个我们最佳,最适合的电脑操作系统就成了一些困难选择人士的一个 ...

  3. 创建一个 Laravel 项目

    创建一个 Laravel 项目,首先需要安装 Composer ,如果没有安装的参考 https://docs.phpcomposer.com/00-intro.html 一.安装 Laravel 安 ...

  4. docker相关概念介绍

    关键词:docker容器与docker镜像 他们之间的关系是docker容器通过docker镜像来创建 docker镜像就是些像ubuntu15.10,ubuntu14.2一样的系统 docker容器 ...

  5. 引入外部js

    引入外部js应该使用完整标签<script></script>,而使用单标签<script src=“”/>是错误的

  6. 关于jQery中$.Callbacks()的理解

    $.Callbacks()主要使用了回调,而说到回调又不得不说javascript的事件循环机制了. 所以想了解回调最好先看看js运行机制. $.Callbacks()可以理解为创建一个回调队列 va ...

  7. # Ubuntu16.04安装nvidia驱动+CUDA+cuDNN

    Ubuntu16.04安装nvidia驱动+CUDA+cuDNN 准备工作 1.查看GPU是否支持CUDA lspci | grep -i nvidia 2.查看Linux版本 uname -m &a ...

  8. 关于Qt画点及计算机专业基础课程介绍

    在计算机图形图像学中,开始都是先画点,我曾经在汇编上tc2.0上画点,后来是MFC,VB,Qt,Python,我觉得对于计算机专业的选择QT的原因是它是个C系的功能强大庞大的库,可以少写很多代码,但是 ...

  9. burp插件之xssValidator

    0x01 安装环境 Phantomjs 下载:http://phantomjs.org/download.html 下载后配置环境变量,把bin目录下的这个exe加入环境变量 xssValidator ...

  10. Beetlex服务框架之Webapi访问限制和url重写

    在新版本的BeetleX.FastHttpApi中集成了IP访问策略和URL重写两个功能,通过IP访问策略可以制定服务针对不同IP的访问限制控制:而URL重写则可以制定更好的URL访问方式.以下介绍这 ...