题目:

题目传送门:这里

题目背景

IOI2009

题目描述

普罗夫迪夫的著名巧克力大师 Bonny 需要切开一板带有葡萄干的巧克力。

巧克力是一个包含许多相同的方形小块的矩形。小块沿着巧克力的边排列成 nnn 行 mmm 列,即共有 n×mn\times mn×m 块。每个小块上有 111 个或多个葡萄干,没有葡萄干在小块的边上或者跨过两个小块。

最开始,巧克力是一整块。Bonny 需要把它切成上述的 n×mn\times mn×m 个独立的小块。因为 Bonny 很忙,她需要她的助手 Sly peter 帮她切。

Peter 只能从一端到另一端切直线,并且他要为他的每一刀得到报酬。Bonny 手头没有钱,但是她有足够的葡萄干,所以她提出用葡萄干付给 peter。Sly peter 同意接受葡萄干,但是有下面的条件:每次他把给定的一块巧克力切成两小块,他都要得到和那块给定的巧克力上葡萄干数目相同的葡萄干。

Bonny 想要付给 peter 尽可能少的葡萄干。她知道这 n×mn\times mn×m 个小块中每一个小块上葡萄干的数目。她可以选择递给 peter 的巧克力的顺序,也可以告诉 peter 如何切(横切还是竖切)以及从哪里切。请告诉 Bonny 如何把巧克力切成一个个独立的小块,使她能够付给 Sly peter 尽可能少的葡萄干。

任务:写一个程序,给定每个小块上葡萄干的数目,计算 Bonny 要付给 Sly peter 的最少的葡萄干的数目。

输入格式

你的程序必须从标准输入中读取下列数据:第一行包含整数 nnn 和 mmm,以一个空格隔开。

接下来的 nnn 行描述了每个小块上葡萄干的数目。这 nnn 行中第 kkk 行描述的是第 kkk 行小块的巧克力。每行包含 mmm 个整数,分别以一个空格隔开。这些整数描述的是该行从左到右的小块。第 kkk 行的第 ppp 个整数表示位于第 kkk 行第 ppp 列的小块上的葡萄干数目。

输出格式

你的程序必须向标准输出写入一行,该行包含一个整数:Bonny 要付给 Sly peter 的最少的葡萄干的数目。

样例 #1

样例输入 #1

2 3
2 7 5
1 9 5

样例输出 #1

77

提示

对于 25%25\%25% 的数据,n,m≤7n,m\leq 7n,m≤7。

对于 100%100\%100% 的数据,1≤n,m≤501\leq n,m\leq 501≤n,m≤50,每小块上的葡萄干数目 si,js_{i,j}si,j​ 满足 1≤si,j≤1031\leq s_{i,j} \leq 10^31≤si,j​≤103。

拓展:

不会吧不会吧,不会还有人不知道二维前缀和怎么算吧!

核心代码: si.j=si−1,j+si,j−1−si−1,j−1+ai,js_{i.j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j}si.j​=si−1,j​+si,j−1​−si−1,j−1​+ai,j​

其中,sss 表示前缀和数组,kkk 表示原数组。

我们可以用一个图形来理解一下:

整个面积就是 si,js_{i,j}si,j​,si−1,js_{i-1,j}si−1,j​ 相当于 a+ba+ba+b,si,j−1s_{i,j-1}si,j−1​ 相当于 a+ca+ca+c,ki,jk_{i,j}ki,j​ 相当于 ddd,si−1,j−1s_{i-1,j-1}si−1,j−1​相当于aaa。

很显然:

si,j=a+b+c+d=(a+b)+(a+c)−a+d=si−1,j+si,j−1−si−1,j−1+ki,j\begin{aligned} s_{i,j} &=a+b+c+d \\ &=(a+b)+(a+c)-a+d \\ &=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+k_{i,j} \end{aligned} si,j​​=a+b+c+d=(a+b)+(a+c)−a+d=si−1,j​+si,j−1​−si−1,j−1​+ki,j​​

当然,这不是严谨的推论,图也不标准,仅供参考。

思路:

显然的,当有一个矩阵满足:

  • 左上角坐标为 (a1,b1)(a1,b1)(a1,b1),右下角坐标为 (a2,b2)(a2,b2)(a2,b2)

则这个矩阵的最优解为:

  • 将这个矩阵切开(横、竖)后的两个矩阵的最优解中的最小值与这个矩阵的各元素之和。

如上,是横着切和竖着切的两种情况。

所以,我们可以 dfs 枚举每一刀切的位置。同时,用记忆化删去部分冗余的计算。定义一个数组 fa,b,c,df_{a,b,c,d}fa,b,c,d​ 进行记忆化搜索。

代码:

#include<bits/stdc++.h>//支持万能头文件!!
using namespace std;
int n,m;
int ra[60][60];         //每块巧克力上的葡萄干数量
int f[60][60][60][60];  //记忆化
int dfs(int a,int b,int c,int d)
{if(f[a][b][c][d]!=0)//如果已经切过这种情况了return f[a][b][c][d];//直接返回  if(b==d&&a==c)  return 0;//如果开始点和结束点是同一点,即没法切了,就returnint ma=1e10;//赋一个极大值,以便后来作min运算for(int i=a;i<c;i++)  ma=min(ma,dfs(a,b,i,d)+dfs(i+1,b,c,d));//横着切,即上边加下边for(int i=b;i<d;i++) ma=min(ma,dfs(a,b,c,i)+dfs(a,i+1,c,d));//竖着切,即左边加右边for(int i=a;i<=c;i++)for(int j=b;j<=d;j++)ma+=ra[i][j];//要付出多少葡萄干return f[a][b][c][d]=ma;/*等价于:f[a][b][c][d]=ma;return f[a][b][c][d];*/
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>ra[i][j];   //循环输入葡萄干}}cout<<dfs(1,1,n,m);return 0;
}

这种做法开 O2 就可以 AC 了,但是,作为一个合格的 oier ,我们应该不断追求更好的做法。

优化思路:

因为考虑到每进行一次 dfs,就要算一遍葡萄干的和,所以很自然地想到利用前缀和数组来优化。

每输入一个数,则对其进行前缀和计算。就避免每次搜索都用一个双层循环来计算。

前缀和代码: si.j=si−1,j+si,j−1−si−1,j−1+ai,js_{i.j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j}si.j​=si−1,j​+si,j−1​−si−1,j−1​+ai,j​

AC代码:

#include<bits/stdc++.h>//支持万能头文件!!
using namespace std;
int n,m;
int ra[60][60];         //每块巧克力上的葡萄干数量
int f[60][60][60][60];  //记忆化
int cc[60][60];         //前缀和数组
int dfs(int a,int b,int c,int d)
{if(f[a][b][c][d]!=0)//如果已经切过这种情况了return f[a][b][c][d];//直接返回  if(b==d&&a==c)  return 0;//如果开始点和结束点是同一点,即没法切了,就returnint ma=1e10;for(int i=a;i<c;i++)    ma=min(ma,dfs(a,b,i,d)+dfs(i+1,b,c,d));//横着切,即上边加下边for(int i=b;i<d;i++) ma=min(ma,dfs(a,b,c,i)+dfs(a,i+1,c,d));//竖着切,即左边加右边f[a][b][c][d]=ma+cc[c][d]-cc[a-1][d]-cc[c][b-1]+cc[a-1][b-1];//这里使用前缀和优化return f[a][b][c][d];
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>ra[i][j];   //循环输入葡萄干cc[i][j]=ra[i][j]+cc[i][j-1]+cc[i-1][j]-cc[i-1][j-1];//计算前缀和}}cout<<dfs(1,1,n,m);return 0;
}

这样不用 O2 就可以过了!

评测记录

P4850 [IOI2009] 葡萄干 raisins 题解相关推荐

  1. P4850 [IOI2009]葡萄干raisins 记忆化搜索

    $ \color{#0066ff}{ 题目描述 }$ 普罗夫迪夫的著名巧克力大师Bonny需要切开一板带有葡萄干的巧克力.巧克力是一个包含许多相同的方形小块的矩形.小块沿着巧克力的边排列成n行m列,即 ...

  2. 洛谷 P4850 [IOI2009] Raisins 题解

    前言: IOI 还出这样水的纯记忆化搜索题?还是 T4?真令人难以置信. 题意: 题目传送门 一个 N × M N\times M N×M 的矩阵,对于任意一个子矩阵,只能横着或竖着分割,并且分割一次 ...

  3. 记忆化搜索 day48

    今天听完派队的教学 感觉又可以水几道紫题了 好耶✌ 不过想起ygg提到的记忆化搜索 自己其实也是没有搞懂的 还是去做了几道题吧 P2476 [SCOI2008]着色方案 紫题喵 最开始想的是一个这样的 ...

  4. sklearn实现决策树,随机森林,逻辑回归,KNN,贝叶斯,SVM,以葡萄干数据集为例

    数据集介绍 本次使用的数据集为葡萄干数据集,来源于UCI中: https://archive.ics.uci.edu/ml/datasets/Raisin+Dataset 介绍为: Images of ...

  5. fcpx插件:Stupid raisins show pop for Mac(20个专业设计徽标动画)

    fcpx插件Stupid raisins show pop是20个专业设计徽标动画插件!用户借助Show Pop的20个专业设计和动画化的多功能展示台,可以快速轻松地展示您的视频,图像,文本或徽标.S ...

  6. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  7. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  8. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  9. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  10. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

最新文章

  1. 搬书匠 mysql_如何java进阶,我一直都有在学习,可是感觉好久都没进步了,心里好焦急?...
  2. ubuntu其中一个账户登录不了_ubuntu怎么在一个终端里以另一个帐户登录
  3. 遭遇内存无法读写的错误
  4. 编译器vs.代码 谁之过
  5. 开源性能可视化工具——FlameScope模式识别
  6. Opencv+Python:drawContours函数
  7. uva10718 - Bit Mask(贪心)
  8. chainmaker-go-sdk 查看客户端日志
  9. 【算法】排序_计数排序
  10. 超实用ExtJS教程100例
  11. USB加密狗复制克隆破解软件
  12. python论文怎么写_用Python写一个论文降重工具
  13. 向大众推荐的字处理器,TEXMACS
  14. u盘是传播计算机病毒的媒介,u盘病毒有几种传播方式
  15. 计算几何(中线长计算三角形面积) - Medians - UVA 10347
  16. 2013年12月CCF软考试题
  17. Java 编写程序,求出几何形状(长方形、正方形、圆形)的周长和面积。
  18. B - Restore Modulo
  19. IP归属地查询(基于本地IP库实现)
  20. HTML--onkeydown和onkeyup区别

热门文章

  1. 2021-2025年中国冷链跟踪和监测系统行业市场供需与战略研究报告
  2. 计算机演示文稿操作,计算机操作与应用 PowerPoint 演示文稿的设计与制作.ppt
  3. 视界云联合创始人姜飞 荣获品途2017年NBI商业影响力新锐人物奖
  4. 【B站】陈睿:令人刮目相看的年轻一代
  5. 通过淘宝数据学习爬虫,python scrapy requests与response对象
  6. js、html实现断点播放视频,视频资源在localStorage中
  7. 原生JS JavaScript实现懒加载效果
  8. java retrofit2_Java Retrofit2使用
  9. AW349 黑暗城堡
  10. Meta研发触觉手套,有人想在元宇宙撸猫,有人产生大胆的想法