【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)相关推荐

  1. 番茄花园 Ghost XP SP3 2011.7月 快速装机版

    番茄花园 Ghost XP SP3 2011.7月 快速装机版 软件大小:692 MB推荐星级: 更新时间:2011-07-15 13:09:16软件类别:国产软件 / 番茄花园 授权方式:免费版 联 ...

  2. 最新手机号段归属地数据库(2017年4月16日版)免费下载

    2017年4月16日版   360569条记录 最新 手机号段数据库 号码归属地数据库  移动号段 联通号段 电信号段 14号段 170号段(虚拟运营商)    权威  全面  准确  规范 字段包括 ...

  3. 转:[置顶] 从头到尾彻底理解KMP(2014年8月22日版)

    [置顶] 从头到尾彻底理解KMP(2014年8月22日版) 转载于:https://www.cnblogs.com/kira2will/p/4111564.html

  4. 网络流题目详讲+题单(提高版)(持续更新中......)

    网络流题目详讲+题单(提高版)(持续更新中......) 标签:图论--网络流 PS:如果你觉得自己还不够强(和我一样弱),可以去入门版看看 阅读体验:https://zybuluo.com/Junl ...

  5. 侍魂胧月传说怎么在电脑上玩 侍魂胧月传说电脑版玩法攻略

    <侍魂胧月传说>由经典日系IP创作的游戏,和风元素是其中独特的亮点之一.游戏中和风元素无处不在,从人物模型到建筑风格,都让和风文化爱好者们大呼过瘾.落英缤纷的神木.流水潺潺的零川.枫红百里 ...

  6. 谷歌 发布android 8,谷歌推出了Android 8.1 预计在12月发布正式版

    原标题:谷歌推出了Android 8.1 预计在12月发布正式版 10月26日消息,谷歌今日正式向开发者推出了Android 8.1首个开发者预览版,预计在12月发布正式版. 谷歌发Android 8 ...

  7. 工具BlueSoleil千月蓝牙破解版,最好的蓝牙驱动

    网上谈到的工具BlueSoleil千月蓝牙破解版,方法千奇百怪,大都是扯淡.该蓝牙驱动根本就不需要花时间去破解,只要限制一下联网就行了.(请往下看) 官方介绍      功能简介 千月蓝牙软件(Blu ...

  8. 最好的蓝牙驱动-BlueSoleil千月蓝牙破解版10.2.497.0-2018\10\9更新下,支持64位系统

    最好的蓝牙驱动-千月10.0.0496破解版-2018年支持64位系统 - 幻生的博客 - CSDN博客 https://blog.csdn.net/qq_36114959/article/detai ...

  9. 西门子工业自动化资料大全 (2019年10月18日版)

    西门子工业自动化资料大全 (2019年10月18日版) 下载地址:www.ad.siemens.com.cn/service/download/documentlist.pdf

最新文章

  1. 属性处理器Spring攻略学习笔记(2.12)------外部化Bean配置
  2. 实用ISA Server 2006之一: 简介
  3. 汤家凤高等数学基础手写笔记-重积分
  4. vue在js上处理后台返回的数组_vuejs 根据后台返回数组,渲染图片路径
  5. C语言素数分解prime factoriziation算法(附完整源码)
  6. php用array_merge实现无限级分类
  7. 【算法】红黑树-二叉树-算法
  8. jquery复选框组清空选中的值_jquery操作复选框(checkbox)的12个小技巧总结
  9. TVM:通过Python接口(AutoTVM)来编译和优化模型
  10. 使用帅气的cordic算法进行坐标系互转及log10的求解
  11. 图像目标检测(Object Detection)原理与实现(一)
  12. Spark RDD Cache Checkpoint
  13. MySQL 5.7.12新增MySQL Shell命令行功能
  14. Atitit if else 选择决策流程ast对比 sql java 表达式类型 binaryExpression hase left and rit expr 目录 1.1. Sql 1
  15. Aliyun mysql配置 远程访问 10038
  16. 【阅读笔记】Implementation of tactical maneuvers with maneuver libraries
  17. centos7 RPM包之rpm命令
  18. 思岚激光雷达A2 Ros配置
  19. C语言:十进制、BCD码互换
  20. 大数据可视化(七)复杂数据可视化

热门文章

  1. 互联网裁员潮亲历者:那些阵痛、挣扎与去向
  2. 在ECS中安装Docker在内部访问RDS数据库
  3. Android 上面实现红外解析(NEC编码)
  4. SuperMap三维专题之3dsMax数据——对接篇
  5. PHP面试题狼与兔子,假设一座圆形的山, 山脚分布着N个山洞, 山洞与山洞形成一个圆环,选择其中一个山洞作为起始, 兔子每天前进到l个洞, 狼每天前进到第k个洞 求多少天后, 兔子与狼在一个洞里
  6. 电池供电应用中的电源设计:干电池特性了解、LDO与DC-DC选型设计、电流检测方案要点
  7. uni-app学习:CSS之渐变色
  8. Simulink代码生成: 使能子系统及其代码
  9. 在文章右上角添加目录导航
  10. Debian7.5--双屏显示问题