刷题向》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\)匹配时所能构成的以\ ...
随机推荐
- Android 如何快速生成aar?
aar主要分为两步 第一步 新建一个Module类似于Eclipse中的project 然后AddLibrary然后点击Finish完成 生成mylibrary-debug.aar文件 然后将.aar ...
- mac 电脑学习笔记 -
新买了个mac mini,第一次用mac,有点linux基础,借此机会记录一下自己的学习过程. 1.个人设置文件 .profile export LS_OPTIONS='--color=auto' # ...
- mysql基础认识1
一.配置文件 服务端和客户端的字符编码不一样时,可能会导致乱码显示等情况,为了统一两端的字符编码,可以通过配置文件进行实现,当然譬如登录账户等信息也可以进行配置,在启动mysql服务端时会自动读取配置 ...
- 【学习】JennyHui学自动化测试
学习材料:虫师的Python书,乙醇的教程 Selenium 常用的键盘事件 智能等待 处理富文本框 定位 界面数据与数据库数据对比 Excel操作 下载文件 Selenium 2.0 学习笔记 == ...
- [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBuild+GitHub)
本系列文章包含: [独孤九剑]持续集成实践(一)- 引子 [独孤九剑]持续集成实践(二)– MSBuild语法入门 [独孤九剑]持续集成实践(三)- Jenkins安装与配置(Jenkins+MSBu ...
- 【学习笔记】Manacher算法
本文部分图片来源 代码来源(代码是学姐哒.. 一.引入 Manacher算法是用来求最长回文子串的算法,时间复杂度O(n). 回文子串指的是''aacaa'',''noon'',这种正着反着读都一样的 ...
- 【ASP.NET Web API2】Digest认证
Digest摘要认证 对于Basic认证方案来说,被传输的认证凭证仅仅采用Base64编码,所以包含密码的认证凭证基本上可以视为明文传输.Digest认证在此基础上进行了改善,在一定程度上提高了安全系 ...
- 解决 Flask-sqlalchemy 中文乱码
当在使用 flask-sqlalchemy 操作 mysql 数据库时中文乱码或者直接报错. 解决方法如下: from flask_sqlalchemy import SQLAlchemy db = ...
- git身份验证失败清除密码缓存
git config --system --unset credential.helper
- OPCDAAuto.dll的C#使用方法浅析(转载)
上次研究了.Net版本的OPC API dll,这次我采用OPCDAAuto.dll来介绍使用方法.以下为我的源代码,有详细的注释无需我多言.编译平台:VS2008SP1.WINXP.KEPServe ...