今天下午打了动态规划的题目
一共有六道题 但我只做了三道题
第三题是csp-j2020的方格取数,让我卡了两个小时
这道题乍一看好像是搜索,但时间复杂度非常高
然后我就想到了二维的dp,但因为能往上走,导致上下的移动会有后效性
又做了三维的dp,多加了一个k判断是从哪里遍历过来的,k=0代表从过面下来的,k=1代表从左面过来的,k=2代表从下面过来的,但是因为可以往上走,有时候要调用的f[x][y][k]还没有被赋值
然后就做了一个函数d(x,y,k) 如果没有被访问过的地方需要用时,我可以先调用那个没有被访问的地方,直到得出结果了在操作
状态转移方程
if(k0) f[x][y][k]=a[x][y]+max(d(x-1,y,0),d(x-1,y,1));
else if(k1) f[x][y][k]=a[x][y]+max(d(x,y-1,1),max(d(x,y-1,0),d(x,y-1,2)));
else f[x][y][k]=a[x][y]+max(d(x+1,y,1),d(x+1,y,2));
k=0 时代表从上方遍历下来的,所以另外两个函数d(x-1,y,0),d(x-1,y,1)中的k分别是0,1,因为它的下方是f[x][y][k],它正是我们要求的值,是没有必要比的
k=1和2同理
但我被卡两个小时的原因是,数组开小了,导致一直re,关键找了很久也没找到是这个原因,也算是涨了点经验吧