求矩阵最少(或最多)路径和(python实现)
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实现)的更多相关文章
- 【python实例】要求输出字符串中最少一个最多八个的所有字符串组合(连续)
""" 题目:字符串str="ABCDEFGHIJK",要求输出最少一个最多八个的所有组合(向后连续字母) 输出如下: A [0::] AB ABC ...
- 市场清仓价格算法 python求矩阵不同行不同列元素和的最大值
问题描述 求矩阵不同行不同列元素和的最大值(最小值) 问题求解 1.通过scipy库求解 scipy.optimize库中的linear_sum_assignment方法可以求解 输入一个矩阵,参数m ...
- POJ 1151 Atlantis(经典的线段树扫描线,求矩阵面积并)
求矩阵的面积并 采用的是区间更新 #include <iostream> #include <stdio.h> #include <string.h> #inclu ...
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
做这道题之前,建议先做POJ 1151 Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...
- Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习
http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...
- MATLAB中求矩阵非零元的坐标
MATLAB中求矩阵非零元的坐标: 方法1: index=find(a); [i,j]=ind2sub(size(a),index); disp([i,j]) 方法2: [i,j]=find(a> ...
- POJ 1151 Atlantis 求矩阵面积并 扫描线 具体解释
题意: 给定n个矩阵的左下角和右上角坐标,求矩阵面积并(矩阵总是正放的,即与x轴y轴都平行) 思路: 扫描线裸题 http://www.cnblogs.com/fenshen371/p/3214092 ...
- 求矩阵中各列数字的和 Exercise08_01
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵中各列数字的和 * */ public class Exercise ...
- 求矩阵主对角线元素的和 Exercise08_02
import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年12月 * 题目:求矩阵主对角线元素的和 * */ public class Exercis ...
随机推荐
- Timed out after 30000 ms while waiting to connect
今天使用mongo-java-drive写连接mongo的客户端,着实被上面那个错坑了一把.回顾一下解决过程: 报错: com.mongodb.MongoTimeoutException: Timed ...
- Spring Boot 2.X(七):Spring Cache 使用
Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 ...
- Java的数组的作业11月06日
动手动脑 实验一:了解for循环得到棋盘结构 (1) 程序: import java.io.*; public class QiPan { //定义一个二维数组来充当棋盘 private String ...
- mysql的十二条基本语句
在 mysql里,所有语句都以分号作为结束标志! 1.连接服务器 Mysql -u username -p passwd 2.当连上服务器后,首先面对的是库,库有1个或多个,因此我们想对表进行操作的话 ...
- Flask中的cookie和session
from flask import Flask app = Flask(__name__) 一.cookie from flask import Flask, make_response, reque ...
- [LUOGU2964] [USACO09NOV]硬币的游戏A Coin Game
题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...
- opencv::Brisk检测与匹配
Brisk(Binary Robust Invariant Scalable Keypoints)特征介绍 构建尺度空间 特征点检测 FAST9-16寻找特征点 特征点定位 关键点描述子
- python属性的默认值
python类的构造函数中属性可以设置默认值,实例化出来的对象如果属性使用默认值,默认值的地址是相同的. class A: def __init__(self, name = []): self.__ ...
- 还在重复写空指针检查代码?考虑使用 Optional 吧!
一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...
- vue实现跑马灯效果
vue实现跑马灯效果为阿中哥哥应援 1.效果图 2.实现代码 <!DOCTYPE html> <html lang="en"> <head> & ...