前言
这一道题不太难,怎么表现呢?
告诉你吧,
萌新写的代码长度25行
。
直入主题
首先呢,我在这里先不直接讲最强大的二维DP,
先从四维开始吧:
基础:
四维DP,
时间、空间复杂度都为 O(n
4
)
用f[i][j][x][y]表示
第一张纸条传到(i,j),
第二张纸条传到(x,y)
它们累计下来的好心程度和。
对于每一步呢,
分别有四种情况
:
1.第一张纸条向下传,第二张纸条向下传;
2.第一张纸条向下传,第二张纸条向右传;
3.第一张纸条向右传,第二张纸条向下传;
4.第一张纸条向右传,第二张纸条向右传;
F[i][j]=max(F[i-1][j][x-1][y] ,F[i-1][j][x][y-1] ,F[i][j-1][x-1][y] ,F[i][j-1][x][y-1])+a[i][j]+a[x][y];
1
那么如何
判重
呢?
其实可以不判,只要你想办法使它没有重复的情况就行了,
So for循环时我们限制y<x。
升级
三维DP,
时间复杂度O(n
3
);空间复杂度多一倍;
我们可以发现每一张纸条每一步
要么只走右边,
要么只走下边,
2
所以i+j=x+y;于是我们DP每一步的情况
3
,
用i表示第一张纸往下走了多少步,因为枚举了k=i+j(就是走了多少步)所以可以用k-i来代替j;
第二张纸也同样可以用k和x表示出来坐标。因为枚举的是步数
4
所以呢,空间才会多一倍。
于是 F[k][i][x]=max(F[k-1][i][x]+F[k-1][i][x-1]+F[k-1][i-1][x]+F[k-1][i-1][x-1]);
Boss进阶:
最强大的二维DP,复杂度和三维一样,但空间少了很多
如果你对背包问题掌握得十分娴熟,你就能用背包思想来降维。怎么做到的呢?
我们从三维DP的状态转移式中发现它只和上一步有关系,
并只牵扯到x,x-1,没用到x+1;
所以我们从后向前推,这样你现在用的二维数组就是上一步的,对x进行覆盖也不会产生后效性。
Readers:这又如何去重呢?
Reply:其实和四维一样,你只需要保证 x > i 就行啦,因为这样就不会有重复情况出现,自然也就不需要去重啦。
萌新求赞!