习题9-3(切蛋糕)【深搜dfs】+【记忆化搜索】

一道来自UVa 1629的切蛋糕问题,要求在n行m列的蛋糕上用最少的切割次数使得每一块都含有一个樱桃。解决方案通过深度优先搜索(DFS)配合记忆化搜索来优化,通过dp矩阵记录已搜索区域的最优解。在搜索过程中,判断区域樱桃数量并进行转移计算,最终实现一次AC。
摘要由CSDN通过智能技术生成

习题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[][][][],既可省力又能使代码美观

代码:


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值