刷题记录 动态规划-7: 63. 不同路径 II
题目:63. 不同路径 II
难度:中等
给定一个 m x n
的整数数组 grid
。一个机器人初始位于 左上角(即 grid[0][0]
)。机器人尝试移动到 右下角(即 grid[m - 1][n - 1]
)。机器人每次只能向下或者向右移动一步。
网格中的障碍物和空位置分别用 1
和 0
来表示。机器人的移动路径中不能包含 任何 有障碍物的方格。
返回机器人能够到达右下角的不同路径数量。
测试用例保证答案小于等于 2 * 109
。
示例 1:
输入:obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
输出:2
解释:3x3 网格的正中间有一个障碍物。
从左上角到右下角一共有 2
条不同的路径:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右
示例 2:
输入:obstacleGrid = [[0,1],[0,0]] 输出:1
提示:
m == obstacleGrid.length
n == obstacleGrid[i].length
1 <= m, n <= 100
obstacleGrid[i][j]
为0
或1
一、模式识别
类似于刷题记录 动态规划-5: 62. 不同路径-CSDN博客,本题我尝试过三种解法:
首先最容易想到的就是基于递归的DFS(深度优先搜索),
然后如果沿着递推公式能想到从终点返回起点这一层就能写出动态规划解法
最后代码随想录还给出了算组合数的方法(数论)
1.DFS
同样地,根据动态规划方法的递推公式可以直接写出基于递归的DFS
2.动态规划
本题属于经典动态规划问题,而且动规的很多要素题干中已经直接给出
五部曲:
1.动规数组意义:位于位置(i, j)时剩余的总步数
2.递推公式:dp(i, j) = dp(i - 1, j) + dp(i, j - 1)
解释:
机器人处于位置(i, j)时,每次只能向下或者向右移动一步两种选择,
分别可以到达(i - 1, j)和位置(i, j - 1),
由于障碍物的存在,会有两类边界情况:
①遇见障碍物dp(i, j) = 0
②当机器人走到边缘位置(i == m - 1 or j == n - 1),路径便只剩下一条:
边缘位置没有障碍物时,路径只剩下一条, dp(i, j) = 1
只要边缘位置有至少一个障碍物,该路径就会被堵死,
不仅时障碍物位置,整条边缘线都被堵死:dp(i, j) = 0
3.初始化:题干:一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )
4.遍历顺序:本题常规,根据递推公式:
注意,dp的访问顺序和机器人的寻路顺序完全相反
5.举例:略
3.数论:算组合数
对于无障碍物的情况:
无论怎么走,从起点(m, n)到终点(1, 1)都要走m + n - 2步,
其中,横向m - 1步,纵向n - 1步
因此该问题就顺理成章的转化成了C(m + n - 2), (m - 1)的组合问题
如果有障碍物,我一开始的思路是
有障碍物总数:总数 - 起点到障碍物路数×障碍物到终点路数
但这个思路是不行的!!!我会在后面详述
二、代码实现
1.DFS
这方法很好想,而且代码简洁,
思路是顺着机器人寻路,所以可读性强,只需要把递推公式表达清楚即可
但就是有个小小的问题:会超时!
class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m, n = len(obstacleGrid), len(obstacleGrid[0])def helper(i, j):if obstacleGrid[i][j] == 1:return 0if i == m - 1 and j == n - 1:return 1if i == m - 1:return helper(i, j + 1)if j == n - 1:return helper(i + 1, j)return helper(i + 1, j) + helper(i, j + 1)return helper(0, 0)
问题源于其指数级的时间复杂度:O(2^(m + n - 1) - 1)
2.动态规划
注意和代码随想录不一样,
我自己写的时候二维OMN空间写法时直接用obstacleGrid充当dp数组,
所以遍历顺序反序,返回值位置是(0, 0)
(1)二维OMN空间写法
class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m, n = len(obstacleGrid), len(obstacleGrid[0])for i in range(m - 1, -1, -1):for j in range(n - 1, -1, -1):if obstacleGrid[i][j] == 1:obstacleGrid[i][j] = 0else:if i == m - 1:if j < n - 1 and obstacleGrid[i][j + 1] == 0:obstacleGrid[i][j] = 0else:obstacleGrid[i][j] = 1elif j == n - 1:if i < m - 1 and obstacleGrid[i + 1][j] == 0:obstacleGrid[i][j] = 0else:obstacleGrid[i][j] = 1else:obstacleGrid[i][j] = obstacleGrid[i + 1][j] + obstacleGrid[i][j + 1]return obstacleGrid[0][0]
- 时间复杂度:O(m × n)
- 空间复杂度:O(m × n)
耗时:0ms
(2)一维ON空间写法
class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m, n = len(obstacleGrid), len(obstacleGrid[0])dp = [1] * nfor i in range(m - 1, -1, -1):for j in range(n - 1, -1, -1):if obstacleGrid[i][j] == 1:dp[j] = 0else:if i == m - 1:if j < n - 1 and dp[j + 1] == 0:dp[j] = 0else:dp[j] = 1elif j == n - 1:if i < m - 1 and dp[j] == 0:dp[j] = 0else:dp[j] = 1else:dp[j] += dp[j + 1]return dp[0]
- 时间复杂度:O(m × n)
- 空间复杂度:O(n)
耗时:0ms
可读性有点差,所以稍微解释一下,和二维空间代码的对应关系:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 和 dp[j] += dp[j - 1]
dp[i][j]: 更新后的dp[j]
dp[i - 1][j]: 更新前的dp[j]
dp[i][j - 1]: dp[j - 1]
三、为什么本题不能用算组合数的方法做?
1.欠考虑的情况
如果按照“总数 - 起点到障碍物路数×障碍物到终点路数”的思路,将写出以下代码:
class Solution:def calculate_conbination(self, m, n):num = 1a, b = m + n - 2, min(m - 1, n - 1)count = bwhile count > 0:num *= aa -= 1while b > 0 and num % b == 0:num //= bb -= 1count -= 1return numdef uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m, n = len(obstacleGrid), len(obstacleGrid[0])ob = Falsex, y = 0, 0for i in range(m):for j in range(n):if obstacleGrid[i][j] == 1:x, y = i, job = Truereturn self.calculate_conbination(m, n) - (self.calculate_conbination(x + 1, y + 1) * self.calculate_conbination(m - x, n - y)) if ob else self.calculate_conbination(m, n)
然后就会这样:
输入
obstacleGrid =
[[0,1],[1,0]]
输出
1
预期结果
0
因为障碍物可能不止一个!!!
2.改进后发现该方法只能解决某些特殊情况
那继续改进,将公式改进为:总数 - Σ起点到障碍物路数×障碍物到终点路数
然后写出这个代码:
class Solution:def calculate_conbination(self, m, n):num = 1a, b = m + n - 2, min(m - 1, n - 1)count = bwhile count > 0:num *= aa -= 1while b > 0 and num % b == 0:num //= bb -= 1count -= 1return numdef uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:m, n = len(obstacleGrid), len(obstacleGrid[0])obs = []for i in range(m):for j in range(n):if obstacleGrid[i][j] == 1:obs.append((i, j))ans = self.calculate_conbination(m, n)for x, y in obs:ans -= (self.calculate_conbination(x + 1, y + 1) * self.calculate_conbination(m - x, n - y))return ans
然后就会这样:
输入
obstacleGrid =
[[0,0,0,0],[0,1,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]]
输出
0
预期结果
7
为什么呢?
因为你当障碍物数量超过一个,可能有些路径被重复计算!
所以该方法只适用于障碍物数量少于等一个的情况!!!
相关文章:
刷题记录 动态规划-7: 63. 不同路径 II
题目:63. 不同路径 II 难度:中等 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0])。机器人尝试移动到 右下角(即 grid[m - 1][n - 1])。机器人每次只能向下或者向右移动一步。…...
7-2 拯救外星人
7-2 拯救外星人 你的外星人朋友不认得地球上的加减乘除符号,但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”,是从 1 到 N 的连乘积。所以当他不知道“57”等于多少时,如果你告诉他等于“12!”,他就写出了“479001600”这个答案。…...
人工智能导论-第3章-知识点与学习笔记
参考教材3.2节的内容,介绍什么是自然演绎推理;解释“肯定后件”与“否定前件”两类错误的演绎推理是什么意义,给出具体例子加以阐述。参考教材3.3节的内容,介绍什么是文字(literal);介绍什么是子…...
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
一、GenBI AI 代理介绍(文末提供下载) github地址:https://github.com/Canner/WrenAI 本文信息图片均来源于github作者主页 在 Wren AI,我们的使命是通过生成式商业智能 (GenBI) 使组织能够无缝访问数据&…...
Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
c语言练习题【消息队列、共享内存、信号灯集】
练习1:消息队列 请使用消息队列实现2个终端之间互相聊天 #发送端 key_t key; int id;typedef struct Msgbuf{long channel;char buf[128];}msg_t;int main(int argc, const char *argv[]) {if (argc<2){printf("传入频道号\n");return 1;}keyftok("./ipc&q…...
力扣 295. 数据流的中位数
🔗 https://leetcode.cn/problems/find-median-from-data-stream/ 题目 数据流中不断有数添加进来,add 表示添加数据,find 返回数据流中的中位数 思路 大根堆存储数据流中偏小的数据小根堆存储数据流中偏大的数据若当前的 num 比大根堆的…...
JavaScript原型链与继承:优化与扩展的深度探索
在 JavaScript 的世界里,万物皆对象,而每个对象都有一个与之关联的原型对象,这就构成了原型链的基础。原型链,简单来说,是一个由对象的原型相互连接形成的链式结构 。每个对象都有一个内部属性[[Prototype]]࿰…...
【建站】专栏目录
建站专栏的想法有很多,想写穷鬼如何快速低成本部署前后端项目让用户能访问到,如何将网站收录到百度,bing,google并优化seo让搜索引擎搜索到网站,想写如何把网站加入google广告或者接入stripe信用卡首款平台收款&#x…...
题目 1160: 出圈
题目描述 设有n个人围坐一圈并按顺时针方向从1到n编号,从第1个人开始进行1到m的报数,报数到第个m人,此人出圈,再从他的下一个人重新开始1到m的报数,如此进行下去直到所剩下一人为止。 输入格式 输入多行,每…...
Python小游戏29乒乓球
import pygame import sys # 初始化pygame pygame.init() # 屏幕大小 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("打乒乓球") # 颜色定义 WHITE (255, 255, 255) BLACK (…...
力扣 【99. 恢复二叉搜索树】Java题解(二叉树的 Morris 遍历)
题目链接 Morris遍历 递归和迭代遍历,不管是前序中序还是后续,空间复杂度都是O(n)(递归是因为隐式调用栈的开销)。 而Morris遍历可以做到空间复杂度是O(1)。 思路就是节点的前序节点的右指针指向该节点,来保证可以通…...
CNN的各种知识点(一):卷积神经网络CNN通道数的理解!
卷积神经网络CNN通道数的理解! 通道数的核心概念解析1. 通道数的本质 2. 单张灰度图的处理示例: 3. 批量输入的处理通道与批次的关系: 4. RGB三通道输入的处理计算过程:示例: 5. 通道数的实际意义6. 可视化理解(1) 单通…...
python-UnitTest框架笔记
UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…...
书生大模型实战营3
文章目录 L0——入门岛git基础Git 是什么?Git 中的一些基本概念工作区、暂存区和 Git 仓库区文件状态分支主要功能 Git 平台介绍GitHubGitLabGitee Git 下载配置验证下载 Git配置 Git验证 Git配置 Git常用操作Git简易入门四部曲Git其他指令 闯关任务任务1: 破冰活动…...
在CentOS服务器上部署DeepSeek R1
在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…...
C++中常用的十大排序方法之4——希尔排序
成长路上不孤单😊😊😊😊😊😊 【😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于C中常用的排序方法之4——希尔排序的相…...
机器学习day7
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数 代码 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyp…...
【流媒体】搭建流媒体服务器
搭建Windows Nginx服务器 搭建 下载nginx工具包解压至本地,并在cmd窗口中切换至nginx所在的本地目录修改 conf/nginx.conf 文件,更改其端口号 server中的 listen的端口号从 80改为 8080,因为80经常被其他服务占用,导致无法打开 …...
(电脑版)植物大战僵尸幼儿园版本,开启你的冒险之旅!
欢迎来到植物大战僵尸中文版,园长Jen已准备好迎接你的挑战!在这个充满乐趣和策略的游戏中,你将体验到多种游戏模式,每种模式都带来不同的挑战和乐趣。 游戏模式: 冒险模式:踏上刺激的冒险旅程,…...
民法学学习笔记(个人向) Part.2
民法学学习笔记(个人向) Part.2 民法始终在解决两个生活中的核心问题: 私法自治;交易安全; 3. 自然人 3.4 个体工商户、农村承包经营户 都是特殊的个体经济单位; 3.4.1 个体工商户 是指在法律的允许范围内,依法经…...
解决SetWindowCompositionAttribute使控件文本透明的问题
用以下参数调用该API,能实现类似Aero的模糊透明效果。 参数具体含义见 https://zhuanlan.zhihu.com/p/569258181 http://www.memotech.de/WindowComposition/Text.txt http://www.memotech.de/WindowComposition/WindowComposition.zip DWORD accent[4] { 3,0,0,0 …...
响应式编程与协程
响应式编程与协程的比较 响应式编程的弊端虚拟线程Java线程内核线程的局限性传统线程池的demo虚拟线程的demo 响应式编程的弊端 前面用了几篇文章介绍了响应式编程,它更多的使用少量线程实现线程间解耦和异步的作用,如线程的Reactor模型,主要…...
Altium Designer绘制原理图时画斜线的方法
第一步:检查设置是否正确 打开preferences->PCB Editor ->Interactive Routing->Interactive Routing Options->Restrict TO 90/45去掉勾选项,点击OK即可。如下图所示: 然后在划线时,按下shift空格就能够切换划线…...
Android --- CameraX讲解
预备知识 surface surfaceView SurfaceHolder surface 是什么? 一句话来说: surface是一块用于填充图像数据的内存。 surfaceView 是什么? 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中,但在wms 中可以理解为…...
动态分库分表
1. 动态分库分表的核心目标 解决单库性能瓶颈:通过水平拆分数据,提升并发处理能力。 支持弹性扩展:在不中断服务的前提下,实现数据分片的动态扩容/缩容。 避免跨分片操作:减少跨分片查询(如JOIN、事务&am…...
shell -c
个人博客地址:shell -c | 一张假钞的真实世界 shell -c {string}:表示命令从-c后的字符串读取。在需要使用管道或者重定向需要sudo时很有用,如下: $ sudo find ../*/exportFiles -mtime 15 -name "*" | xargs -I {} r…...
Spring Boot 2 快速教程:WebFlux处理流程(五)
WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…...
10.8 LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践
LangChain Output Parsers终极指南:从JSON解析到流式处理的规范化输出实践 关键词: LangChain Output Parsers、结构化输出、JSON解析、数据校验、流式处理 一、为什么需要规范化输出?大模型输出的“荒野西部”问题 原始输出的三大痛点: 格式不可控:模型可能返回纯文本、…...
G1. Yunli‘s Subarray Queries (easy version)
题目链接:Problem - 2009G1 - Codeforces 题目大意: 给你一个长度为n的整数数组a序列, 然后你可以操作任何次, 将序列里的一个数换成其他任意数字。 后有q次询问, 每一次询问[L, R] 在此区间里, 可最少进行…...
[漏洞篇]SQL注入漏洞详解
[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…...
【apt源】RK3588 平台ubuntu20.04更换apt源
RK3588芯片使用的是aarch64架构,因此在Ubuntu 20.04上更换apt源时需要使用针对aarch64架构的源地址。以下是针对RK3588芯片在Ubuntu 20.04上更换apt源到清华源的正确步骤: 步骤一:打开终端 在Ubuntu 20.04中,按下Ctrl Alt T打…...
Maven
什么是Maven? Maven是一个项目管理工具,基于POM(Project Object Model,项目对象模型)的概念呢,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven包含了一个…...
软件工程概论试题五
一、多选 1.好的软件的基本属性包括()。 A. 效率 B. 可依赖性和信息安全性 C. 可维护性 D.可接受性 正答:ABCD 2.软件工程的三要素是什么()? A. 结构化 B. 工具 C.面向对象 D.数据流! E.方法 F.过程 正答:BEF 3.下面中英文术语对照哪些是正确的、且是属…...
Python量化交易助手:xtquant的安装与应用
Python量化交易助手:xtquant的安装与应用 技术背景和应用场景 在量化交易领域,Python因其强大的库支持和灵活性成为了许多开发者的首选语言。其中,xtquant 是迅投官方开发的一个Python包,专门用于与miniqmt通信,实现…...
opencv图像处理框架
一.课程简介与环境配置 二.图像基本操作 (1)计算机眼中的视觉 1)计算机眼中图像是由一块块组成,每一块又由很多很多个像素点组成,一个像素点的值是在0到255之间,值越大就越亮。 2)RGB表示彩色图像的三个颜色通道(红绿蓝),一张…...
MotionLCM 部署笔记
目录 依赖项 humanml3d: sentence-t5-large 下载数据: 报错:No module named sentence_transformers 继续报错:from transformers.integrations import CodeCarbonCallback 解决方法: 推理相关 GitHub - Dai-W…...
BUUCTF_[安洵杯 2019]easy_web(preg_match绕过/MD5强碰撞绕过/代码审计)
打开靶场,出现下面的静态html页面,也没有找到什么有价值的信息。 查看页面源代码 在url里发现了img传参还有cmd 求img参数 这里先从img传参入手,这里我发现img传参好像是base64的样子 进行解码,解码之后还像是base64的样子再次进…...
LLM - 基于LM Studio本地部署DeepSeek-R1的蒸馏量化模型
文章目录 前言开发环境快速开始LM Studio简单设置模型下载开始对话 模型选择常见错误最后 前言 目前,受限于设备性能,在本地部署的基本都是DeepSeek-R1的蒸馏量化模型,这些蒸馏量化模型的表现可能并没有你想象的那么好。绝大部分人并不需要本…...
Intel 与 Yocto 项目的深度融合:全面解析与平台对比
在嵌入式 Linux 领域,Yocto 项目已成为构建定制化 Linux 发行版的事实标准,广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者,在 Yocto 生态中投入了大量资源,为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…...
2025-工具集合整理
科技趋势 github-rank 🕷️Github China/Global User Ranking, Global Warehouse Star Ranking (Github Action is automatically updated daily). 科技爱好者周刊 制图工具 D2 D2 A modern diagram scripting language that turns text to diagrams 文档帮助 …...
快速提升网站收录:利用网站新闻发布功能
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/63.html 利用网站新闻发布功能快速提升网站收录是一个有效的策略。以下是一些具体的建议,帮助你更好地利用这一功能: 一、保持新闻更新频率 搜索引擎尤其重视网站的…...
wxss样式模板,全局配置window
1 wxss样式模板 1.1什么是wxss 1.2 rpx 1.3 样式导入 1.4 全局样式 1.5局部样式 2 全局配置 2.1 全局配置window 2.2 window 导航栏区域...
git多人协作
目录 一、项目克隆 二、 1、进入克隆仓库设置 2、协作处理 3、冲突处理 4、多人协作分支的推送拉取删除 1、分支推送(2种) 2、远程分支拉取(2种) 3、远程分支删除 一、项目克隆 git clone 画船听雨眠/test1 (自定义的名…...
Maven全解析:从基础到精通的实战指南
概念: Maven 是跨平台的项目管理工具。主要服务基于 Java 平台的构建,依赖管理和项目信息管理项目构建:高度自动化,跨平台,可重用的组件,标准化的流程 依赖管理: 对第三方依赖包的管理…...
使用Pytorch训练一个图像分类器
一、准备数据集 一般来说,当你不得不与图像、文本或者视频资料打交道时,会选择使用python的标准库将原始数据加载转化成numpy数组,甚至可以继续转换成torch.*Tensor。 对图片而言,可以使用Pillow库和OpenCV库对视频而言…...
除了成本核算,还有哪些财务分析工具可以提高工作效率?
除了成本核算,财务工作中还有多种分析工具可以提高工作效率,以下是详细介绍: 一、数据可视化工具 Power BI:这是一款强大的数据可视化工具,通过创建交互式报表、仪表板和图表来展示财务数据。它易于使用,提…...
【SSM】Spring + SpringMVC + Mybatis
SSM课程,以下为该课程的笔记 bean:IOC容器创建的对象 P12 bean的生命周期 在bean中定义init()和destroy()方法,然后在xml中配置方法名,让bean对象能找到对应的生命周期方法。 或通过实现接口的方式定义声明周期方法。 P13 sett…...
Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget? 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…...
pstricks PGFTikz 在CTeX套装中绘图Transparency或Opacity失效的问题
我在CTeX中画图的时候,习惯用Geogebra先画好,然后生成pstricks或PGFTikz代码: 这样不用插入eps或pdf之类的图片,也是一种偷懒的方法。以前往arXiv.org上面传论文也是这样:代码出图,就不用另外上传一幅eps或…...