博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【课后服务】20181022切蛋糕
阅读量:5856 次
发布时间:2019-06-19

本文共 1026 字,大约阅读时间需要 3 分钟。

权当抛砖引玉吧,掌握记搜的方法最重要。

#include
#include
#include
using namespace std;int n,m,k;bool book[21][21];int cake[21][21];int dp[21][21][21][21];int yt(int x,int y,int w,int h)//返回蛋糕内樱桃值;x、y表示左上角坐标,w、h表示长和宽{ int yingtao=cake[x+w][y+h]-cake[x+w][y]-cake[x][y+h]+cake[x][y]; return yingtao;}int dfs(int x,int y,int w,int h)//开成int类型{ int ans=2147483647; if(dp[x][y][w][h]!=-1) return dp[x][y][w][h];//若x,y,w,h的状态已被搜过,则返回已经保存的结果 if(yt(x,y,w,h)==1) return 0;//樱桃值为1时,代价为0(不用再切了) if(yt(x,y,w,h)==0) return 214748364;//樱桃值为0时,代价无穷大;但在实现时,INF不能大于INT_MAX/2 for(int i=1;i

记忆化搜索,其实就是动态规划(DP)与搜索的完美结合,提高了搜索的效率,也提供了DP的道路。

所谓动态规划,就是动态的规划,其本质就是“状态转移”——从一种情况直接或间接推出其他情况。对于本题而言,就是要想清楚如何得到最小代价,是由哪几部分组成。

so本题具体操作如下:

定义一四维数组dp,存储在x,y,w,h的状态下的最小代价。

定义一int类型函数dfs,其返回值即为代价。若蛋糕已有解,则直接返回现有代价。否则若当前蛋糕内樱桃值为1,返回代价为0。若当前蛋糕内樱桃值为0,返回代价为“无穷大”。否则继续枚举可供下刀的行和列,继续对两侧进行搜索,打擂台寻找最小代价。遍历完所有情况后,保存当前结果并返回上一层。

小结:记忆化搜索与暴搜的最大区别在于,前者对搜索进行了优化,对当前结果进行了记录,避免了重复搜索。

转载于:https://www.cnblogs.com/dong-ji-yuan/p/9845264.html

你可能感兴趣的文章
navigator 应用
查看>>
Netty 4.1.35.Final 发布,经典开源 Java 网络服务框架
查看>>
详解Microsoft.AspNetCore.CookiePolicy
查看>>
go与c互相调用
查看>>
如何优雅地用Redis实现分布式锁
查看>>
程序员的4条忠告,你做到了几条
查看>>
从零开始Docker化你的Node.js应用
查看>>
你真的需要活动目录吗?
查看>>
Python自动化开发学习1-2
查看>>
centos6.5下搭建fastdfs分布式存储
查看>>
在 PowerPC 下安装 K8S
查看>>
SCDPM2012 R2实战一:基于SQL 2008 R2集群的SCDPM2012 R2的安装
查看>>
tomcat7 的server.xml 里面 Connector 配置官方说明
查看>>
安装Ruby2.0
查看>>
SQL SERVER中字段类型与C#数据类型的对应关系
查看>>
StringBuffer
查看>>
2017年6月8日 笔记
查看>>
vue.js component 学习手记
查看>>
保存对象、关系映射
查看>>
父页面与子页面的相互操作
查看>>