【DP练习】月饼盒(提高版)(vijos1255)
【DP练习】月饼盒(提高版)
测试链接:https://vijos.org/p/1255
【题目背景】:中秋节了,CCC老师决定去送礼。
【问题描述】:一个被分为 n*m 个格子的月饼盒,第 i 行第 j 列位置的格子里面有 a [ i , j ]个月饼。本来CCC老师打算送这盒月饼给某人的,但是就在要送出月饼盒的前一天晚上,一只极其可恶的老鼠夜袭月饼盒,有部分格子被洗劫并且穿了洞。CCC老师必须尽快从这个月饼盒里面切割出一个矩形月饼盒,新的月饼盒不能有洞,并且CCC老师希望保留在新月饼盒内的月饼的总数尽量多。
【题目任务】:请帮CCC老师设计一个程序 计算一下新月饼盒最多能够保留多少月饼。
【文件输入】第一行有两个整数 n、m。第 i + 1 行的第 j 个数表示 a [ i , j ],如果这个数为 0 ,则表示这个位置的格子被洗劫过。其中:1 ≤ n,m ≤ 300 , 0 ≤ a [ i , j ]≤ 255
【文件输出】:输出最大月饼数
【样例输入】
3 4
1 2 3 4
5 0 6 3
10 3 4 0
【样例输出】
17
PS:对于40%的数据,N ,M≤80
对于60%的数据,N ,M≤400
对于100%的数据,N,M≤1000
解题:
题目大意说的很清楚,其中有两个限制条件:
1、切割出来的需要是一个矩形
2、切割出来的矩形里不能有为0的数
首先我们要想的是怎么去切割矩形,这个我们不妨把思路转换一下,让我们来想想一个矩形应该是怎么的出来的?
矩形的构成有两大要素,长和宽,说到这里大家应该有点思路了吧?
没错,有两种方式可以来构建一个矩形
(1)先确定长,然后不断延伸它的宽
(2)先确定宽,然后延伸它的长
这道题我们便可以利用这个思路来解题。
下面我们来分析一下:
假设我们当前遍历到a[0][0],即刚刚开始
1.从a[0][0]出发,向右遍历(注意:我们只需要向右遍历),确认从当前位置出发,所能得到最大的长(遍历到0或者到边界则停止,进入下一步),以此作为矩形的长,我们得到了它的最大长为4,即从a[0][0]-->a[0][3]
2.我们以这个长为中心,上下延伸矩形的宽,可分两步来
(1)往上延伸,遇到0或到达边界则返回,否则继续向上扩展。在例子中,我们往上延伸,第一次就达到了边界,,因此直接返回,往上扩展的宽度为0。
(2)往下延伸,遇到0或到达边界则返回,否则继续向下扩展。在例子中,我们向下延伸,在第一次就遇到了0,因此直接返回,向下延伸的宽度为0。
3.这个时候,就得到了我们想要的矩形了,此时我们在将矩形中数据的和与当前记录的最大值作比较,如果大于最大值则替换最大值。
我们以另一起点再来分析模拟一遍,假设我们当前遍历到了a[1][2],如下图:
1.我们以a[1][2]为起点,向右遍历(注意:我们只需要向右遍历),确认从当前位置出发,所能得到最大的长(遍历到0或者到边界则停止,进入下一步),以此作为矩形的长,我们得到了它的最大长为2,即从a[1][2]-->a[1][3]
2.我们以这个长为中心,上下延伸矩形的宽,还是分两步来
(1)往上延伸,遇到0或到达边界则返回,否则继续向上扩展。在例子中,我们往上延伸,第一次发现可以满足要求,此时宽+1,继续往上延伸,达到了边界,,因此直接返回,往上扩展的宽度为1。
当前的矩形如图:
(2)往下延伸,遇到0或到达边界则返回,否则继续向下扩展。在例子中,我们向下延伸,在第一次就遇到了0,因此直接返回,向下延伸的宽度为0。
3.这个时候,就得到了我们想要的矩形了,此时我们在将矩形中数据的和与当前记录的最大值作比较,如果大于最大值则替换最大值。
代码实现:
#include<stdio.h>int n,m,a[305][305];//往上扩展
int searchup(int miny,int maxy,int x){
// printf("up\n");int sum = 0;if(x < 0) return 0;for(int i = miny; i <= maxy; i++){if(a[x][i] == 0)return 0;sum += a[x][i];}return sum+searchup(miny,maxy,x-1);
}//往下扩展
int searchdown(int miny,int maxy,int x){
// printf("down\n");int sum = 0;if(x > n) return 0;for(int i = miny; i <= maxy; i++){if(a[x][i] == 0)return 0;sum += a[x][i];}return sum+searchdown(miny,maxy,x+1);
}int main()
{int i,j,k;scanf("%d %d",&n,&m);for(i = 0 ; i < n ; i++)for(j = 0 ; j < m ; j++)scanf("%d",&a[i][j]); int max = 0 , sum = 0, miny = -1,maxy = -1; for(i = 0 ; i < n ; i++){for(k = 0 ; k < m ; k++){if(a[i][k] == 0) continue;
// printf("a[%d][%d]=%d\n",i,k,a[i][k]);for(j = k ; j < m ; j++){miny = k;sum += a[i][j];//确定矩形的长if(a[i][j] == 0 || j == m-1){maxy = j;if(a[i][j] == 0) maxy--;
// printf("前:miny = %d,maxy = %d,sum = %d, i = %d\n",miny,maxy,sum,i);sum += searchup(miny,maxy,i-1);sum += searchdown(miny,maxy,i+1);
// printf("后:miny = %d,maxy = %d,sum = %d, i = %d\n",miny,maxy,sum,i);miny = -1;if(sum > max)max = sum;sum = 0;break;} }}}printf("%d\n",max);return 0;}
写得不好的地方还望指出,感谢大家的支持。
【DP练习】月饼盒(提高版)(vijos1255)相关推荐
- 番茄花园 Ghost XP SP3 2011.7月 快速装机版
番茄花园 Ghost XP SP3 2011.7月 快速装机版 软件大小:692 MB推荐星级: 更新时间:2011-07-15 13:09:16软件类别:国产软件 / 番茄花园 授权方式:免费版 联 ...
- 最新手机号段归属地数据库(2017年4月16日版)免费下载
2017年4月16日版 360569条记录 最新 手机号段数据库 号码归属地数据库 移动号段 联通号段 电信号段 14号段 170号段(虚拟运营商) 权威 全面 准确 规范 字段包括 ...
- 转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)
[置顶] 从头到尾彻底理解KMP(2014年8月22日版) 转载于:https://www.cnblogs.com/kira2will/p/4111564.html
- 网络流题目详讲+题单(提高版)(持续更新中......)
网络流题目详讲+题单(提高版)(持续更新中......) 标签:图论--网络流 PS:如果你觉得自己还不够强(和我一样弱),可以去入门版看看 阅读体验:https://zybuluo.com/Junl ...
- 侍魂胧月传说怎么在电脑上玩 侍魂胧月传说电脑版玩法攻略
<侍魂胧月传说>由经典日系IP创作的游戏,和风元素是其中独特的亮点之一.游戏中和风元素无处不在,从人物模型到建筑风格,都让和风文化爱好者们大呼过瘾.落英缤纷的神木.流水潺潺的零川.枫红百里 ...
- 谷歌 发布android 8,谷歌推出了Android 8.1 预计在12月发布正式版
原标题:谷歌推出了Android 8.1 预计在12月发布正式版 10月26日消息,谷歌今日正式向开发者推出了Android 8.1首个开发者预览版,预计在12月发布正式版. 谷歌发Android 8 ...
- 工具BlueSoleil千月蓝牙破解版,最好的蓝牙驱动
网上谈到的工具BlueSoleil千月蓝牙破解版,方法千奇百怪,大都是扯淡.该蓝牙驱动根本就不需要花时间去破解,只要限制一下联网就行了.(请往下看) 官方介绍 功能简介 千月蓝牙软件(Blu ...
- 最好的蓝牙驱动-BlueSoleil千月蓝牙破解版10.2.497.0-2018\10\9更新下,支持64位系统
最好的蓝牙驱动-千月10.0.0496破解版-2018年支持64位系统 - 幻生的博客 - CSDN博客 https://blog.csdn.net/qq_36114959/article/detai ...
- 西门子工业自动化资料大全 (2019年10月18日版)
西门子工业自动化资料大全 (2019年10月18日版) 下载地址:www.ad.siemens.com.cn/service/download/documentlist.pdf
最新文章
- 属性处理器Spring攻略学习笔记(2.12)------外部化Bean配置
- 实用ISA Server 2006之一: 简介
- 汤家凤高等数学基础手写笔记-重积分
- vue在js上处理后台返回的数组_vuejs 根据后台返回数组,渲染图片路径
- C语言素数分解prime factoriziation算法(附完整源码)
- php用array_merge实现无限级分类
- 【算法】红黑树-二叉树-算法
- jquery复选框组清空选中的值_jquery操作复选框(checkbox)的12个小技巧总结
- TVM:通过Python接口(AutoTVM)来编译和优化模型
- 使用帅气的cordic算法进行坐标系互转及log10的求解
- 图像目标检测(Object Detection)原理与实现(一)
- Spark RDD Cache Checkpoint
- MySQL 5.7.12新增MySQL Shell命令行功能
- Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql	1
- Aliyun mysql配置 远程访问 10038
- 【阅读笔记】Implementation of tactical maneuvers with maneuver libraries
- centos7 RPM包之rpm命令
- 思岚激光雷达A2 Ros配置
- C语言:十进制、BCD码互换
- 大数据可视化(七)复杂数据可视化
热门文章
- 互联网裁员潮亲历者:那些阵痛、挣扎与去向
- 在ECS中安装Docker在内部访问RDS数据库
- Android 上面实现红外解析(NEC编码)
- SuperMap三维专题之3dsMax数据——对接篇
- PHP面试题狼与兔子,假设一座圆形的山, 山脚分布着N个山洞, 山洞与山洞形成一个圆环,选择其中一个山洞作为起始, 兔子每天前进到l个洞, 狼每天前进到第k个洞 求多少天后, 兔子与狼在一个洞里
- 电池供电应用中的电源设计:干电池特性了解、LDO与DC-DC选型设计、电流检测方案要点
- uni-app学习:CSS之渐变色
- Simulink代码生成: 使能子系统及其代码
- 在文章右上角添加目录导航
- Debian7.5--双屏显示问题