习题9-3
【UVa 1629】Cake Slicing(切蛋糕)
题目大意:
有一个n行m列(1<=n,m<=20)的网格蛋糕上有一些樱桃。每次可以用一刀沿着网格线把蛋糕切成两块,并且只能够直切不能拐弯。要求最后每一块蛋糕上恰好有一个樱桃,且切割线总长度最小。
思路:
刚看到这道题的时候因为有了前两题的经验就往记忆化搜索那边靠,一下就想到了搜索思路:dp[x][y][xlen][ylen]表示以(x,y)为起点的分别以xlen,ylen为边长的矩形区域的最优解,这样就可以横着切每条网格线和纵着切每条网格线,对于每个搜索到的区域,如果之前没访问过,那么首先要判断此区域是否存在樱桃,有几个,如果没有则可以直接返回一个极大值抛弃这种情况,如果只有一个那就是末状态了,返回0,表明这一块的最小值为0,如果有多于1个,继续切割,每次转移时考虑切下来的两块的最优值加上切这一刀的花费。
转移方程:dfs(x,y,xlen,ylen)=min(dfs(x,y,xlen,ylen),dfs(x,y,i-x+1,ylen)+ylen+dfs(i+1,y,xlen-(i-x+1),ylen),dfs(x,y,xlen,j-y+1)+xlen+dfs(x,j+1,xlen,ylen-(j-y+1)));
tips:在dfs时可以用一个引用代表dp[][][][],既可省力又能使代码美观