2024/1/27
突然醒悟,动态规划的终极目标是减少重复计算,因此在从子问题向结果推的过程中,只保留最有价值的答案即可。
(完了写到最后感觉自己理解的还是有问题)
不可避免地需要考虑所有情况,但在考虑所有情况的过程中,其中的在同一子条件下的子情况,是有最优的,同时需要注意的是此最优子情况并不影响之后的选择。
比如,五个花瓶要插三朵花,每个花瓶插到不同花瓶里的美感值不同,求最大美感值的和及其对应的方案。
设五个花瓶是ABCDE,三朵花是abc。
A | B | C | D | E | |
a | 7 | 23 | -5 | -24 | 16 |
b | 5 | 21 | -4 | 10 | 23 |
c | -21 | 5 | -44 | -20 | 23 |
其中一种子情况是(但不一定是最优),在A中插一朵花。可能是a,b,c,此时并不能理解为,当只有一朵花的时候,就是a插A,因为条件是不同的。
什么时候是条件相同的呢?
就是:如果让ab插ABC/让ac插ABC/让bc插ABC。在一个条件下,比如ab插ABC,此条件下有三种情况:ab分别插:AB、BA、AC、CA、BC、CB。
因此我们将这些计算出来:28、28、3、0、19、16。看起来最大的就是28,所以将这个保存下来。如果以后用到了ab插ABC的时候,就不会再递推计算其他插花方案了。
比如在计算的时候,c插到C中后,需要计算ab插到AB/AD/AE/BD/BE/DE的情况。(留坑,之后再想:是不是还可以这样分:ab插到ABD/ABE/BDE这三种情况)如果按照之前的方式算,只需要比较6个数即可,不再去深入分情况。这里的意思是,c插到C,存在AB的情况,c插到D和E,也存在AB的情况。因此不需要再重复计算。
或者按照上面举的例子,c插到D中,存在ab插到ABC的情况,c插到E中,也存在。而若在计算c到D中的时候,ab在ABC中的最大值,当c插到E中时,直接使用ab在ABC中的最大值即可,不用再去细分为AB/BA/AC/CA/BC/CB然后计算。
当然,最优解并不一定会使用ab插在ABC中的情况。
写到这里我怎么感觉我写的有问题...