刷题向》DP》值得一做》关于对DP问题的充分考虑(normal)
在你辛苦调试一道DP题,遇到瓶颈的时候,你是否感到一股洪荒之力遏制住你的思想,使你给题库贡献了一倍的WA、RE、TLE量,却没有AC过一次?
在这时,你应该考虑的是砸电脑再次重新考虑整个题目,再应对自己的思路考虑,是否你的思路对应这个题目有局限性?
那在这里,就给大家提供一道基础的扩展思路完全性的题目:分蛋糕
题目如下:
有一块矩形大蛋糕,长和宽分别是整数w 、h。现要将其切成m块小蛋糕,每个小蛋糕都必须是矩形、且长和宽均为整数。切蛋糕时,每次切一块蛋糕,将其分成两个矩形蛋糕。请计算:最后得到的m块小蛋糕中,最大的那块蛋糕的面积下限。
假设w= 4, h= 4, m= 4,则下面的切法可使得其中最大蛋糕块的面积最小。
那么关于这道题,我的标程是在网上找的(U盘丢了→_→),虽然这道题只是一道平常的DP题,但是它让我学到了在解决DP问题的时候要考虑解决问题的完全性。
首先看标程,在标程里,在程序里,每当我们确定要分的块数、以及当前被分的蛋糕的长、宽的时候,我们第一步是先枚举这一刀要切在哪里,先得出一个当前能求出来的最小值,先把它记录在当前数组里,然后就没了。
怎么可能没了!!!当我们求出这一刀切在哪里的时候,才是我们这个程序最精彩的地方,想通这点,我们便可以直接get到以后DP的一个思路,我管它叫分锅(滑稽脸)。
那么我们是怎么进行分锅的捏,很简单,当我们确定这一刀分在哪里的时候,思路会有一个局限性:已经枚举所有情况。但是我们会发现在对于当前你的刀分的地方,是严重不平衡的,一半是充满的由以前的数据得出的最优分刀情况,一半是一刀也没有切,事实上,对于DP,当前所枚举的东西是当前确定的,而关于与当前步骤无关的一切都是由前面所递推取最优所得到的部分解,所以,在我们只确定当前刀的情况下,关于当前空间的其他状况都要另作考虑(也就是考虑更小部分的最优解),所以才有了标程里的又一重循环:在确认当前步骤的情况下(分锅)寻找剩余部分可能的最优解。
代码如下:
#include<cstdio>
#include<iostream>
using namespace std;
#define N 25
#define INF 5005
int f[N][N][N];int w,h,m;
int main(){
w=h=m=;
for(int i=;i<=w;i++){
for(int j=;j<=h;j++){
f[i][j][]=i*j;
for(int k=;k<=m;k++){
f[i][j][k]=INF;
for(int r=;r<i;r++){
f[i][j][k]=min(f[i][j][k],max(f[r][j][k-],(i-r)*j));
for(int p=;p<k;p++)
f[i][j][k]=min(f[i][j][k],max(f[r][j][p],f[i-r][j][k-p]));
} for(int c=;c<j;c++){
f[i][j][k]=min(f[i][j][k],max(f[i][c][k-],(j-c)*i));
for(int p=;p<k;p++)
f[i][j][k]=min(f[i][j][k],max(f[i][c][p],f[i][j-c][k-p]));
}
}
}
}
while(scanf("%d%d%d",&w,&h,&m)&&(w||h||m)){
printf("%d\n",f[w][h][m]);}
return ;
}
分蛋糕
刷题向》DP》值得一做》关于对DP问题的充分考虑(normal)的更多相关文章
- 刷题向》关于第一篇状压DP BZOJ1087 (EASY+)
这是本蒟蒻做的第一篇状压DP,有纪念意义. 这道题题目对状压DP十分友善,算是一道模板题. 分析题目,我们发现可以用0和1代表每一个格子的国王情况, 题目所说国王不能相邻放置,那么首先对于每一行是否合 ...
- 刷题总结——二叉苹果树(ssoj树形dp+记忆化搜索)
题目: 题目背景 URAL:http://acm.timus.ru/problem.aspx?space=1&num=1018 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 2 叉(就是说 ...
- 面试刷题32:你对tomcat做了哪些性能调优?
背景 java程序员的开发的java应用程序,一般都会选择使用tomcat发布,但是: 如何充分的掌控tomcat,并让它发挥最优性能呢? 这也是面试的热点问题,结合多年的工作实践,我是李福春,今天总 ...
- 刷题总结——Cut the Sequence(POJ 3017 dp+单调队列+set)
题目: Description Given an integer sequence { an } of length N, you are to cut the sequence into sever ...
- 刷题向》图论》BZOJ1179 关于tarjan和SPFA的15秒(normal)
这道题可以考察图论的掌握程度(算半道水题) 题目如下 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i ...
- 刷题46. Permutations
一.题目说明 题目是46. Permutations,给一组各不相同的数,求其所有的排列组合.难度是Medium 二.我的解答 这个题目,前面遇到过类似的.回溯法(树的深度优先算法),或者根据如下求解 ...
- 【刷题】BZOJ 4543 [POI2014]Hotel加强版
Description 同OJ3522 数据范围:n<=100000 Solution dp的设计见[刷题]BZOJ 3522 [Poi2014]Hotel 然后发现dp的第二维与深度有关,于是 ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- DP刷题记录(持续更新)
DP刷题记录 (本文例题目前大多数都选自算法竞赛进阶指南) TYVJ1071 求两个序列的最长公共上升子序列 设\(f_{i,j}\)表示a中的\(1-i\)与b中色\(1-j\)匹配时所能构成的以\ ...
随机推荐
- HAWQ取代传统数仓实践(八)——维度表技术之角色扮演维度
单个物理维度可以被事实表多次引用,每个引用连接逻辑上存在差异的角色维度.例如,事实表可以有多个日期,每个日期通过外键引用不同的日期维度,原则上每个外键表示不同的日期维度视图,这样引用具有不同的含义.这 ...
- 正则 去除html标签
String.prototype.stripHtml=function(){ var re=/<(?:.)*?>/g; // *? 意味着匹配任意数量的重复 return this.rep ...
- Hibernate之mappedBy【必读】
[http://www.cnblogs.com/redcoatjk/p/4236445.html] 一.mappedBy 单向关系不需要设置该属性,双向关系必须设置,避免双方都建立外键字段 数据库中1 ...
- weblogic控制台的启动与禁用
在一些安全漏洞扫描中,经常会扫描发现,使用weblogic管理控制台,会有个中危的漏洞. http://192.168.10.46:7001/console/login/LoginForm.jsp W ...
- 2018年总结和2019年的Flag
---恢复内容开始--- 目前截止到现在工作将近一年半了,今天工作上主要后端主要是用了两种语言,java和Python(2.7),今年完成主要的工作主要使用Python在写一些脚本来满足财务和人资部门 ...
- zookeeper运维(转)
本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...
- Java知识点汇总
Java中泛型的本质 Java中静态变量的适用场景 Java类加载原理及类加载器 Java中对Clone的理解 Java中HashMap的实现 Java中Collection和Collections的 ...
- B/S与C/S的区别
参考:http://www.cnblogs.com/groler/articles/2116905.html 一.概念 C/S结构:即Client/Server(客户机/服务器)结构,是大家熟知的软件 ...
- erlang使用心跳模式启动shell
资料http://blog.yufeng.info/archives/2832 借鉴自从http://blog.csdn.net/mycwq/article/details/18306753 测试例子 ...
- MATLAB01
在命令行窗口输入edit就会进入代码编写区,编写完毕点击运行后会先进行保存,然后再执行代码,保存时候一定要以英文开头. 数组 创建矩阵: 函数名 描述 zero(m,n) 创建m行n列全零矩阵 one ...