【十六】【动态规划】97. 交错字符串、712. 两个字符串的最小ASCII删除和、718. 最长重复子数组,三道题目深度解析

动态规划

动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重复计算。

动态规划与数学归纳法思想上十分相似。

数学归纳法:

  1. 基础步骤(base case):首先证明命题在最小的基础情况下成立。通常这是一个较简单的情况,可以直接验证命题是否成立。

  2. 归纳步骤(inductive step):假设命题在某个情况下成立,然后证明在下一个情况下也成立。这个证明可以通过推理推断出结论或使用一些已知的规律来得到。

通过反复迭代归纳步骤,我们可以推导出命题在所有情况下成立的结论。

动态规划:

  1. 状态表示:

  2. 状态转移方程:

  3. 初始化:

  4. 填表顺序:

  5. 返回值:

数学归纳法的基础步骤相当于动态规划中初始化步骤。

数学归纳法的归纳步骤相当于动态规划中推导状态转移方程。

动态规划的思想和数学归纳法思想类似。

在动态规划中,首先得到状态在最小的基础情况下的值,然后通过状态转移方程,得到下一个状态的值,反复迭代,最终得到我们期望的状态下的值。

接下来我们通过三道例题,深入理解动态规划思想,以及实现动态规划的具体步骤。

97. 交错字符串 - 力扣(LeetCode)

题目解析

状态表示

对于两个字符串之间的dp问题,我们的一般的思考方式如下:

  1. 选取第一个字符串的[0,i]区间以及第二个字符串的[0,j]区间当成研究对象,结合题目要求来定义状态表示。

  2. 然后根据两个区间上最后一个位置的状况进行分类讨论,从而确定状态转移方程。

由于这段题目里面空串是研究意义的,因此我们先预处理一下原字符串,前面统一加上一个占位符:s1=s1+“ ”,s2=s2+” “,s3=s3+” “;

根据上述思路,我们很容易可以定义这样一个状态表示,

定义dp[i][j]表示字符串s1中[1,i]区间内的字符串以及s2中[1,j]区间内的字符串能否拼接成s3中[1,i+j]区间内的字符串。

状态转移方程

  1. 如果s3[i+j]==s1[i], 此时s3[i+j]与s1[i]匹配,如果s1[1,i-1]和s2[1,j]可以拼成s3[1,i+j-1]说明s1[1,i]和s2[1,j]可以拼成s3[1,i+j],此时dp[i][j]=dp[i-1][j];

  2. 如果s3[i+j]==s2[j], 此时s3[i+j]与s2[i]匹配,如果s1[1,i]和s2[1,j-1]可以拼成s3[1,i+j-1]说明s1[1,i]和s2[1,j]可以拼成s3[1,i+j],此时dp[i][j]=dp[i][j-1];

  3. 如果s3[i+j]!=s1[i]&&s3[i+j]!=s2[j], 此时dp[i][j]=false;

综上所述,将false设置为初始值,得到状态转移方程为

 
    dp[i][j] = (s1[i] == s3[i + j] && dp[i - 1][j]) ||(s2[j] == s3[i + j] && dp[i][j - 1]);

初始化

根据状态转移方程,我们知道,想要推到(i,j)位置的状态,我们需要用到(i-1,j)(i,j-1)位置的状态。

所以我们需要初始化第一行和第一列。

  1. 初始化第一行, 第一行表示s1是空串,此时s2[1,j]必须和s3[1,i+j]对应相等,dp[i][j]才为true。

  2. 初始化第一列, 第一列表示s2是空串,此时s1[1,j]必须和s3[1,i+j]对应相等,dp[i]j]才为true。

故初始化为,

 
    for (int j = 1; j <= n; j++) if (s2[j] == s3[j])dp[0][j] = true;elsebreak;for (int i = 1; i <= m; i++)if (s1[i] == s3[i])dp[i][0] = true;elsebreak;

填表顺序

根据状态转移方程,我们知道,想要推到(i,j)位置的状态,我们需要用到(i-1,j)(i,j-1)位置的状态。

  1. 固定i,改变j, i的变化需要从小到大,由于需要用到(i,j-1)位置的状态,所以j的变化也需要从小到大。

  2. 固定j,改变i, j的变化需要从小到大,由于需要用到(i-1,j)位置的状态,所以i的变化也需要从小到大。

返回值

定义dp[i][j]表示字符串s1中[1,i]区间内的字符串以及s2中[1,j]区间内的字符串能否拼接成s3中[1,i+j]区间内的字符串。

结合题目意思,我们需要判断字符串s1中[1,m]区间内的字符串以及s2中[1,n]区间内的字符串能否拼接成s3中[1,m+n]区间内的字符串。

故返回dp[m][n];

代码实现

 
class Solution {
public:bool isInterleave(string s1, string s2, string s3) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回值int m = s1.size(), n = s2.size();if (m + n != s3.size())return false;s1 = " " + s1, s2 = " " + s2, s3 = " " + s3;vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));dp[0][0] = true;for (int j = 1; j <= n; j++) if (s2[j] == s3[j])dp[0][j] = true;elsebreak;for (int i = 1; i <= m; i++)if (s1[i] == s3[i])dp[i][0] = true;elsebreak;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)dp[i][j] = (s1[i] == s3[i + j] && dp[i - 1][j]) ||(s2[j] == s3[i + j] && dp[i][j - 1]);return dp[m][n];}
};

712. 两个字符串的最小ASCII删除和 - 力扣(LeetCode)

题目解析

状态表示

对于两个字符串之间的dp问题,我们的一般的思考方式如下:

  1. 选取第一个字符串的[0,i]区间以及第二个字符串的[0,j]区间当成研究对象,结合题目要求来定义状态表示。

  2. 然后根据两个区间上最后一个位置的状况进行分类讨论,从而确定状态转移方程。

根据上述思路,我们很容易可以定义这样一个状态表示,

定义dp[i][j]表示s1[0,i]和s2[0,j]区间中所有公共子序列ASCII的最大和。

状态转移方程

  1. 如果公共子序列包括s1[i]和s2[j],此时s1[i]==s2[j], 此时dp[i][j]=dp[i-1][j-1]+s1[i];或者dp[i][j]=dp[i-1][j-1]+s2[j];

  2. 如果公共子序列包括s1[i]但是不包括s2[j], 因为要使得公共子序列ASCII尽可能大,所以此时s1[i]!=s2[j], 此时dp[i][j]=dp[i][j-1];

  3. 如果公共子序列包括s2[j]但是不包括s1[i], 因为要使得公共子序列ASCII尽可能大,所以此时s1[i]!=s2[j], 此时dp[i][j]=dp[i-1][j];

  4. 如果公共子序列不包括s1[i]也不包括s2[j], 因为要使得公共子序列ASCII尽可能大,所以此时s1[i]!=s2[j], 此时dp[i][j]=dp[i-1][j-1];

将上述情况进行合并和简化,得到状态转移方程,

 
    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);if (s1[i] == s2[j])dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i]);

初始化

根据状态转移方程,我们知道在推导(i,j)位置的状态时需要用到(i,j-1)(i-1,j)(i-1,j-1)以及s1(i-1)和s2(j-1)的值。

所以蓝色部分会发生越界情况,此时推导这些位置的状态没有前驱值,所以我们需要将这些位置的状态进行初始化。

我们可以正常对这些位置进行初始化,也可以添加虚拟结点代替这些位置的虚拟化。

添加虚拟节点,即多添加一行和一列,代替原先需要初始化的位置,现在只需要初始化绿色位置的值,即可。这样做的好处是绿色位置的初始化过程可能很简单,而蓝色位置的初始化过程可能稍微复杂。

我们添加虚拟节点后,状态表示、状态转移方程会发生改变,即 定义dp[i][j]表示s1[0,i-1]和s2[0,j-1]区间中所有公共子序列ASCII的最大和。

 
    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);if (s1[i - 1] == s2[j - 1])dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i - 1]);

添加虚拟结点之后有两点注意事项,

  1. 初始化虚拟节点,必须保证推导后续位置的状态的正确性。

  2. 下标的映射关系。

初始化虚拟节点:

我们根据状态表示,定义dp[i][j]表示s1[0,i-1]和s2[0,j-1]区间中所有公共子序列ASCII的最大和,可以将第一行和第一列虚拟节点位置表示为空串的意义,统一状态表示。

接下来初始化绿色位置的状态。

  1. 初始化第一行, 此时i=0,表示s1为空串,公共子序列不存在,所以对应ASCII值应该为0。将第一行全部初始化为0。

  2. 初始化第一列, 此时j=0,表示s2为空串,公共子序列不存在,所以对应ASCII值应该为0。将第一列全部初始化为0。

下标映射关系:

  1. 此时,定义dp[i][j]表示s1[0,i-1]和s2[0,j-1]区间中所有公共子序列ASCII的最大和。 dp中i对应s1的i-1位置,dp中j对应s2的j-1位置。

  2. 如果在s1,s2前面添加一个占位符,就可以使得dp中i,j继续映射s1,s2中i,j。

我们这里选择第一种解决办法。

填表顺序

根据状态转移方程,

 
    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);if (s1[i - 1] == s2[j - 1])dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i - 1]);

我们知道在推导(i,j)位置的状态时,需要用到(i,j-1)(i-1,j)(i-1,j-1)以及s1(i-1)和s2(j-1)的值。

  1. 固定i改变j, i的变化需要从小到大,由于需要用到(i,j-1)位置的状态,所以j的变化需要从小到大。

  2. 固定j改变i, j的变化需要从小到大,由于需要用到(i-1,j)位置的状态,所以j的变化需要从小到大。

返回值

根据状态表示,定义dp[i][j]表示s1[0,i-1]和s2[0,j-1]区间中所有公共子序列ASCII的最大和。

结合题目要求,我们需要找到s1[0,m-1]和s2[0,n-1]区间中所有公共子序列ASCII的最大和。然后返回”s1,s2中ASCII和“ - 2*dp[m][n];

代码实现

 
class Solution {
public:int minimumDeleteSum(string s1, string s2) {// 1. 创建 dp 表// 2. 初始化// 3. 填表// 4. 返回值int m = s1.size(), n = s2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++) {dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);if (s1[i - 1] == s2[j - 1])dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + s1[i - 1]);}int sum = 0; // 统计元素和for (auto s : s1)sum += s;for (auto s : s2)sum += s;return sum - dp[m][n] - dp[m][n];}
};

718. 最长重复子数组 - 力扣(LeetCode)

题目解析

状态表示

对于两个字符串之间的dp问题,我们的一般的思考方式如下:

  1. 选取第一个字符串的[0,i]区间以及第二个字符串的[0,j]区间当成研究对象,结合题目要求来定义状态表示。

  2. 然后根据两个区间上最后一个位置的状况进行分类讨论,从而确定状态转移方程。

根据上述思路,我们很容易可以定义这样一个状态表示,

dp[i][j]表示以nums1中i位置元素结尾、nums2中j位置元素结尾的所有公共子数组中,最长的公共子数组长度值。

状态转移方程

  1. 如果nums1[i]==nums2[j], 因为是子数组,所以,如果以nums1[i]、nums2[j]为结尾的公共子数组长度大于等于2,此时一定包括nums1[i-1]、nums[j-1]元素。此时dp[i][j]=dp[i-1][j-1]+1。

  2. 如果nums1[i]==nums2[j], 此时不存在以nums1[i]、nums2[j]为结尾的公共子数组,所以长度为0。

故状态转移方程为,

 
if (nums1[i] == nums2[j]) dp[i][j] = dp[i - 1][j - 1] + 1, ret = max(ret, dp[i][j]);

初始化

根据状态转移方程,我们知道在推导(i,j)位置的状态时可能需要用到(i-1,j-1)位置的状态。

所以蓝色位置的状态会发生越界,此时推导(i,j)位置的状态时没有前驱值,所以我们需要初始化这些位置的状态。

或者我们可以添加虚拟节点,即多添加一行和一列,使这些虚拟节点成为蓝色位置的前驱,这样就不用初始化蓝色位置的值,而变为初始化虚拟节点即可。

这样做的好处是,虚拟结点的初始化可能比蓝色部分位置状态的初始化要简便许多。

添加虚拟结点后,状态表示和状态转移方程会发生改变,即,

dp[i][j]表示以nums1中i-1位置元素结尾、nums2中j-1位置元素结尾的所有公共子数组中,最长的公共子数组长度值。

 
if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1, ret = max(ret, dp[i][j]);

添加虚拟节点后,有两点注意事项,

  1. 初始化虚拟节点,必须保证推导后续位置的状态的正确性。

  2. 下标的映射关系。

初始化虚拟节点:

我们根据状态表示,dp[i][j]表示以nums1中i-1位置元素结尾、nums2中j-1位置元素结尾的所有公共子数组中,最长的公共子数组长度值,可以将第一行和第一列虚拟节点位置表示为空串的意义,统一状态表示。

接下来初始化绿色位置的状态。

  1. 初始化第一行, 此时i=0,表示nums1为空串,公共子数组不存在,所以对应长度值应该为0。将第一行全部初始化为0。

  2. 初始化第一列, 此时j=0,表示nums2为空串,公共子数组不存在,所以对应长度值应该为0。将第一列全部初始化为0。

下标映射关系:

  1. 此时,定义dp[i][j]表示nums1[0,i-1]和nums2[0,j-1]区间中所有公共子序列ASCII的最大和。 dp中i对应nums1的i-1位置,dp中j对应nums2的j-1位置。

  2. 如果在nums1,nums2前面添加一个占位符,就可以使得dp中i,j继续映射nums1,nums2中i,j。

我们这里选择第一种解决办法。

填表顺序

根据状态转移方程,我们知道在推导(i,j)位置的状态时可能需要用到(i-1,j-1)位置的状态。

  1. 固定i改变j, 此时i的变化需要从小到大,j的变化可以从小到大也可以从大到小。

  2. 固定j改变i, 此时j的变化需要从小到大,i的变化可以从小到大也可以从大到小。

返回值

dp[i][j]表示以nums1中i-1位置元素结尾、nums2中j-1位置元素结尾的所有公共子数组中,最长的公共子数组长度值。

结合题目意思,我们需要返回所有情况下最长的公共子数组的长度值,所以我们需要遍历dp表找到最大的值然后返回。

代码实现

 
class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m = nums1.size(), n = nums2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));int ret = 0;for (int i = 1; i <= m; i++)for (int j = 1; j <= n; j++)if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1, ret = max(ret, dp[i][j]);return ret;}
};

结尾

今天我们学习了动态规划的思想,动态规划思想和数学归纳法思想有一些类似,动态规划在模拟数学归纳法的过程,已知一个最简单的基础解,通过得到前项与后项的推导关系,由这个最简单的基础解,我们可以一步一步推导出我们希望得到的那个解,把我们得到的解依次存放在dp数组中,dp数组中对应的状态,就像是数列里面的每一项。最后感谢您阅读我的文章,对于动态规划系列,我会一直更新,如果您觉得内容有帮助,可以点赞加关注,以快速阅读最新文章。

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/601703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadolint:Lint Dockerfile 的完整指南

想学习如何使用 Hadolint 对 Dockerfile 进行 lint 处理吗&#xff1f;这篇博文将向您展示如何操作。这是关于 Dockerfile linting 的完整指南。 通过对 Dockerfile 进行 lint 检查&#xff0c;您可以及早发现错误和问题&#xff0c;并确保它们遵循最佳实践。 什么是Hadolint…

坐标转换 | EXCEL中批量将经纬度坐标(EPSG:4326)转换为墨卡托坐标(EPSG:3857)

1 需求 坐标系概念&#xff1a; 经纬度坐标&#xff08;EPSG:4326&#xff09;&#xff1a;WGS84坐标系&#xff08;World Geodetic System 1984&#xff09;是一种用于地球表面点的经纬度坐标系。它是美国国防部于1984年建立的&#xff0c;用于将全球地图上的点定位&#xff0…

Vue-2、初识Vue

1、helloword小案列 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>初始Vue</title><!--引入vue--><script type"text/javascript" src"https://cdn.jsdelivr.n…

【贪心算法】Dijkstra 算法及其衍生

目录 Dijkstra 算法Dijkstra 算法正确性证明 Dijkstra 算法的复杂度优化 Dijkstra 算法的衍生SSSP的应用 Dijkstra 算法 1959 年&#xff0c;Edsger Dijkstra 提出一个非常简单的贪心算法来求解单源最短路径问题&#xff08;Single-Source Shortest Path&#xff0c;SSSP&…

[C#]使用PaddleInference图片旋转四种角度检测

官方框架地址】 https://github.com/PaddlePaddle/PaddleDetection.git 【算法介绍】 PaddleDetection 是一个基于 PaddlePaddle&#xff08;飞桨&#xff09;深度学习框架的开源目标检测工具库。它提供了一系列先进的目标检测算法&#xff0c;包括但不限于 Faster R-CNN, Ma…

一张照片来跳舞,AI带去你跳科目三

大家好我是在看&#xff0c;记录普通人学习探索AI之路。 重生之我是秦始皇&#xff0c;起猛了看见兵马俑在跳舞。 最近&#xff0c;随着社交媒体上热议的科目三话题热度持续飙升&#xff0c;阿里集团旗下的通义千问项目团队精准把握住了这一社会潮流&#xff0c;借势推出了一…

PHP 基础编程 1

文章目录 前后端交互尝试php简介php版本php 基础语法php的变量前后端交互 - 计算器体验php数据类型php的常量和变量的区别php的运算符算数运算符自增自减比较运算符赋值运算符逻辑运算 php的控制结构ifelseelse if 前后端交互尝试 前端编程语言&#xff1a;JS &#xff08;Java…

OpenHarmony鸿蒙源码下载编译和开发环境搭建

目录 一、开发环境搭建和源码下载二、编译三、总结 一、开发环境搭建 最好是在如Ubuntu18.04以上的系统中搭建&#xff0c;不然有些软件依赖需要解决&#xff0c;加大搭建时间 如gitee中开源OpenHarmony中的文档所示&#xff0c;搭建开发环境&#xff0c;搭建文档网站如下&a…

Supershell反溯源配置

简介 项目地址&#xff1a;https://github.com/tdragon6/Supershell Supershell是一个集成了reverse_ssh服务的WEB管理平台&#xff0c;使用docker一键部署&#xff08;快速构建&#xff09;&#xff0c;支持团队协作进行C2远程控制&#xff0c;通过在目标主机上建立反向SSH隧…

【Java EE初阶六】多线程案例(单例模式)

1. 单例模式 单例模式是一种设计模式&#xff0c;设计模式是我们必须要掌握的一个技能&#xff1b; 1.1 关于框架和设计模式 设计模式是软性的规定&#xff0c;且框架是硬性的规定&#xff0c;这些都是技术大佬已经设计好的&#xff1b; 一般来说设计模式有很多种&#xff0c;…

Go语言之父:开源14年,Go不止是编程语言,究竟做对了哪些?

提及编程语言&#xff0c;2023 年&#xff0c;除了老牌的 C 和新晋之秀 Rust 热度最高之外&#xff0c;就要数 Go 了。 从 2009 年由 C 语言获取灵感而发布&#xff0c;到如今风靡已久的高性能语言&#xff0c;Go 已经走过了 14 个年头。 “Go是一个项目&#xff0c;不只是一门…

基于ssm的智慧社区电子商务系统+vue论文

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …

在MS中基于perl脚本实现氢键统计

氢原子与电负性大的原子X以共价键结合&#xff0c;若与电负性大、半径小的原子Y&#xff08;O F N等&#xff09;接近&#xff0c;在X与Y之间以氢为媒介&#xff0c;生成X-H…Y形式的一种特殊的分子间或分子内相互作用&#xff0c;称为氢键。 氢键通常是物质在液态时形成的&…

第1章 线性回归

一、基本概念 1、线性模型 2、线性模型可以看成&#xff1a;单层的神经网络 输入维度&#xff1a;d 输出维度&#xff1a;1 每个箭头代表权重 一个输入层&#xff0c;一个输出层 单层神经网络&#xff1a;带权重的层为1&#xff08;将权重和输入层放在一起&#xff09; 3、…

数据库设计——DML

D M L \huge{DML} DML DML&#xff1a;数据库操作语言&#xff0c;用来对数据库中的数据进行增删改查。 增&#xff08;INSERT&#xff09; 使用insert来向数据库中增加数据。 示例&#xff1a; -- DML : 数据操作语言 -- DML : 插入数据 - insert -- 1. 为 tb_emp 表的 us…

Kubernetes二进制部署 单节点

一、环境准备 k8s集群master1&#xff1a;192.168.229.90 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群node1: 192.168.229.80 kubelet kube-proxy docker flannel k8s集群node2: 192.168.229.70 kubelet kube-proxy docker flannel 至少2C2G 常见的k…

Flutter3.X基础入门教程(2024完整版)

Flutter介绍&#xff1a; Flutter是谷歌公司开发的一款开源、免费的UI框架&#xff0c;可以让我们快速的在Android和iOS上构建高质量App。它最大的特点就是跨平台、以及高性能。 目前Flutter已经支持 iOS、Android、Web、Windows、macOS、Linux的跨平台开发。 教程所讲内容支持…

独立式键盘控制步进电机实验

#include<reg51.h> //包含51单片机寄存器定义的头文件 sbit S1P1^4; //将S1位定义为P1.4引脚 sbit S2P1^5; //将S2位定义为P1.5引脚 sbit S3P1^6; //将S3位定义为P1.6引脚 unsigned char keyval; //储存按键值 unsigned char ID; …

bat批处理文件_命令汇总(2)

文章目录 1、换行2、返回上一级目录cd..3、隐藏指令回显echo off4、开启指令回显echo on5、用关闭echo off指令本身的回显6、echo提示信息 1、换行 cd.. echo. echo. echo. pause2、返回上一级目录cd… 3、隐藏指令回显echo off echo off echo hello1 echo hello2 pause4、开…