为了不占用您的时间,如果您已经能对有关多维数组代码上的错误进行自查,我就不建议您看这篇 用无大用 无用也无大无用 的蒟蒻文章了
这里不做过多介绍。
引入理解主题的前言
三维介绍
其实都知道,三维是有x、y、z三个量,其中肯定有人想着“x,y是二维也就是平面直角坐标系的两个量,所以三维只是将平面加了一个z而已”注意,这段说辞的意思一般来说就是一个水平平面多增了一个高叫“z”,但是这是错的!在讲平面直角坐标系前,我们对于长方形、正方形,准确来说叫矩形的几何图形计算面积时会说“长乘宽等于其面积”但在往其他地方走一下可知:三角形叫高,是不是因为其所谓的宽(长)没有在这几何图形上,从而换了说法?
三角形的那个没有在自己身上却进入计算的那一条边叫“高”(直角三角形除外,其高可以算作在一条直角边上),平行四边形也叫“高”(特殊的,长方形的高可以算作在一条边上),甚至是梯形也叫“高”(依旧有特殊) 那...矩形能叫“高”吗?其实从我们接触矩形的时候就不叫“长”与“宽”了,叫“底”与“高”,所以并不是换了说法,而是为了我们自身的理解叫成了“长”与“宽”。当我们开始接触三维,也就是立体几何图形时,方便后续理解,改回正确叫法:“底”“高”。
了解完这些,你应该会知道为何“x,y是二维也就是平面直角坐标系的两个量,所以三维只是将平面加了一个z而已”这段话是错的了吧,知道就看下一自然段,不知道继续看:“z”是我们常说的高,但在三维运用中,“z”只是二维上的高,“x”是二维上的底,那不用多说,“y”是啥?(以免还有人不知道,“y”是二维在不考虑平面直角坐标系中不存在的,也就是三维上的高)
跟我一样玩MC的小伙伴,在按下键盘上F3时,可以看见所处坐标,当你在不跳跃,只按下“w a s d”时,就会发现“x”与“z”坐标变化了,但“y”坐标始终没有变化(开自动跳跃的可以再去过一次清明节了),现在知道为什么了吧。
重头戏 四维
有过这方面知识储备的小盆友应该会知道,四维包含三个空间维度与一个时间维度,三个空间维度就是上文的“x z
y”,既已理解四维,看下一自然段,不知的继续看:想象一个房间,这个房间里有一个盒子,过了一个单位的时间后,盒子变成了糖果,又过了一个单位的时间后,有一个不愿意透露姓名的小盆友一个瞬移进来迅速吃掉了糖果,又瞬移出去了,房间里甚都没有。又过了一个单位的时间,房间里莫名多出一个卡片。好,故事结束,当我们把这个房间里的状态以一个数组(列表)a以1开始来存储,那便是:a[1]=“盒子”,a[2]=“糖果”,a[3]=“NULL”(代表空),a[4]=“卡”。这就是时间维度的存贮,一个单个单个的个体组成的一维时间维度,相当于一个0维的空间维度(一个点)被一个当把每个时间单位状态都记录下来的数组(列表)存了起来。若这个房间不再是一个一个的存,像第一个时间单位,不再只有一个盒子,而同时拥有一个盒子,一个袋子,设存储盒子这个位子的单独变化(盒子->糖->NULL->卡片)的数组(列表)为a1,若是袋子这个位子也在单独变化,则有一个a2数组(列表)来存储这个位子的变化,这就是两个时间线的变化量存储,但这里两个数组(列表)所表述的的都是这个房间里的变化,并且所记录位子也不重复,所以这里理应合并为一个数组(列表),一个2
* 4二维的数组(列表),但是表述的是一个时间维度与记录每个时间的两个位子状态的维度,而非“x”与“z”的维度。此时我们再延伸,这些位子有固定摆放顺序,不在只有两个位子,而是有四个位子摆成了2*2的样子,且每个位子与上述描述相同,那么这个a数组便改为三维数组(列表),同样是一个时间维度与一个“x”还有一个“z”组成的3维,而非“x”“z”“y”。最后,4个位子变成了8个,摆成了2 * 2 *
2的立体位子,且位子记录描述上同,就会是一个时间维度,与一个“x”和“z”还有一个“y”。再...我们第一次说的记录为a[时间],则第二次为a[时间][x],第三次a[时间][x][z],第四次便是a[时间][x][z][y]。这就是我们的四维数组(列表)。恭喜你理解啦!(没理解?重看这一自然段“:(”)
别说了,ACgo网站是个编程网站,且c++用户居多(据我了解),所以四维空间该如何在DP代码中去进行理解呢?
仔细看这四个数组(此乃c++数组,学P的理解成列表)
第一个相当于将一个 一个 的点变成一个 十个 的点,且这十个点连续;
第二个在第一个基础上,将每个 一个 的点变成每个 十个 的点,且这 每个 十个点连续;
第三个再在第二个基础上,将每个 一个 的点变成每个 十个 的点,且这 每个 十个点连续;
第四个同理。
简的来说第四个就是一个10 * 10 * 10的点阵,变成10 * 10 * 10的 长度为20的数组 阵
用处呢?
在记忆化搜索中兴许有用
主要还是在DP(动态规划)上作每个状态量的记录。
======================
======================
======================
这里就举了理解四维的方法,这里再举5维的理解例子 (标题是“四维与自查多维DP代码的方法与理解”没说不能拓展)
简的来说 五维就是一个立体的点阵,变成立体的 面 阵,
前三个中括号代表10 * 10 * 10点阵,后两个中括号代表每一个点变成了20 * 20的面,所以这里来说就是“一个用20 * 20的面(不是吃的那个面)摆成的 10 * 10 * 10的立体阵列”(由于评论区搁那里讨论四维究竟是啥,我这里就不说五维是啥了,免得又起风波)(你这么理解,不再担心脑子在自查有关多维数组代码上错误时抽了。没懂? 把这句话给AI,AI给你解释)
======================
======================
======================
草草结束
希望这篇来自我自己的投稿能帮助到你理解四维空间转三维的原理来推论自己多维DP的代码原理以防报错后急着找不到从何下手
最后说一个东西,由于内容价值太小,就不单独发讨论了
在m=2时
与
其实是不等价的(不考虑时间复杂度,只考虑代码运行后的效果)
感谢您抽出时间观看完此文,若有错误,欢迎您在评论区留言,我会抽空回复的,谢谢