题目链接:http://acm.swust.edu.cn/problem/589/

Time limit(ms): 2000        Memory limit(kb): 65535
 
Description
告诉你们一个好消息,Wraith前几天天得到一块西瓜,但是是长方体形的.... 
Wraith发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200). 
现在Wraith决定从这m*n*h立方厘米的西瓜中切出mm*nn*hh立方厘米的一块小西瓜(一定是立方体形,长宽高均为整数),然后吃掉它.他想知道他最多能获得多少营养值.(0 <= mm <= m,0 <= nn <= n,0 <= hh <= h.mm,nn,hh的值由您来决定). 
换句话说,我们希望从一个m*n*h的三维矩阵中,找出一个三维子矩阵,这个子矩阵的权和最大. 

 
Input
首行三个数h,m,n(注意顺序),分别表示西瓜的高,长,宽. 
以下h部分,每部分是一个m*n的矩阵,第i部分第j行的第k个数表示西瓜第i层,第j行第k列的那块1立方厘米的小正方体的营养值. 
1 <= h <= 32,1 <= m,n <= 50,保证h <= m,n

 
Output
Wraith所能得到的最大营养值

 
Sample Input
2 3 4
4 1 2 8
0 5 -48 4
3 0 1 9
2 1 4 9
1 0 1 7
3 1 2 8
Sample Output
45

解题思路:

这一题,求一个最大长方体,就需要将长方体压缩成矩阵,再压缩成线,总体是三维的,时间效率T(n)=O(n5)
最大加权矩形我们用sum[i][j]表示前 i 行的第 j 列的和,这里我们可以以此类推,用sum[i][j][k]表示前 i 层、前 j 行的第 k 列的和,
这里在放一下图具体说明一下
那么sum[i][j][k] = sum[i][j - 1][k] + sum[i][j][k - 1] - sum[i][j - 1][k - 1] + x[i][j][k],自己可以模拟一下
然后我们就枚举行(上界sx 和 下界ex),枚举列(上界sy 和下界ey),再枚举高h
现在就需要把他们压缩了,把他们压缩出来记为ptr,用下图来说明(图在网上找的,有点问题,可以自己用画图画来看看,汗~~~)
ptr=sum[i][ex][ey] - sum[i][sx - 1][ey] - sum[i][ex][sy - 1] + sum[i][sx - 1][sy - 1];
然后就变成线性的问题了Orz~~~
 
代码如下:
 #include <iostream>
#include <algorithm>
using namespace std;
#define maxn 51
#define inf 0x3f3f3f3f
int h, m, n, ans;
int sum[maxn][maxn][maxn], x[maxn][maxn][maxn], dp[maxn][maxn][maxn][maxn];
//sum前h层,前i行,第j列的权值之和,dp数组三维压缩成二维后sx,sy点到ex,ey点构成平面矩形最值 int main(){
cin >> h >> m >> n;
for (int i = ; i <= h; i++)
for (int j = ; j <= m; j++)
for (int k = ; k <= n; k++){
cin >> x[i][j][k];
sum[i][j][k] = sum[i][j - ][k] + sum[i][j][k - ] - sum[i][j - ][k - ] + x[i][j][k];
}
for (int sx = ; sx <= m; sx++)
for (int sy = ; sy <= n; sy++)
for (int ex = sx; ex <= m; ex++)
for (int ey = sy; ey <= n; ey++){
dp[sx][sy][ex][ey] = -inf;
for (int i = ; i <= h; i++){
//ptr压缩出来的矩阵块权值和
int ptr = sum[i][ex][ey] - sum[i][sx - ][ey] - sum[i][ex][sy - ] + sum[i][sx - ][sy - ];
dp[sx][sy][ex][ey] = max(dp[sx][sy][ex][ey] + ptr, ptr);
ans = max(dp[sx][sy][ex][ey], ans);
}
}
cout << ans << endl;
return ;
}

[Swust OJ 589]--吃西瓜(三维矩阵压缩)的更多相关文章

  1. [Swust OJ 603]--吃饺子大王

      题目链接:http://acm.swust.edu.cn/problem/603/ Time limit(ms): 1000 Memory limit(kb): 65535   同学们还记得我们班 ...

  2. [Swust OJ 404]--最小代价树(动态规划)

    题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535   Des ...

  3. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)

    题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...

  4. [洛谷 P3788] 幽幽子吃西瓜

    妖梦费了好大的劲为幽幽子准备了一个大西瓜,甚至和兔子铃仙打了一架.现在妖梦闲来无事,就蹲在一旁看幽幽子吃西瓜.西瓜可以看作一个标准的球体,瓜皮是绿色的,瓜瓤是红色的,瓜皮的厚度可视为0.妖梦恰好以正视 ...

  5. C++实现矩阵压缩

    C++实现矩阵压缩 转置运算时一种最简单的矩阵运算.对于一个m*n的矩阵M,他的转置矩阵T是一个n*m的矩阵,且T(i,j) = M(j,i). 一个稀疏矩阵的转置矩阵仍然是稀疏矩阵. 矩阵转置 方案 ...

  6. SWUST OJ NBA Finals(0649)

    NBA Finals(0649) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 404 Accepted: 128   Descri ...

  7. 【九度OJ】题目1474:矩阵幂 解题报告

    [九度OJ]题目1474:矩阵幂 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1474 题目描述: 给定一个n*n的矩阵,求该矩阵的 ...

  8. 【九度OJ】题目1193:矩阵转置 解题报告

    [九度OJ]题目1193:矩阵转置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1193 题目描述: 输入一个N*N的矩阵,将其转置 ...

  9. 【九度OJ】题目1191:矩阵最大值 解题报告

    [九度OJ]题目1191:矩阵最大值 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1191 题目描述: 编写一个程序输入一个mXn的 ...

随机推荐

  1. JQuery打造下拉框联动效果

    做联动效果,若是用纯JavaScript来做,往往须要辅助页面保存须要刷新的结果集,然后渲染到原页面.考虑将须要动态刷新的内容自己主动拼接到前一个下拉框之后,当前一个下拉框onchange后,同级的后 ...

  2. 利用虚拟光驱实现 将WINDOWS文件供虚拟机中的UBUNTU共享

    此方法只能实现(至少目前我发现只能这样)将文件传递给虚拟机中的ubuntu 中,供ubuntu系统阅读,拷贝等,但不能将ubuntu中的数据传递给windows. 即:每次更新windows的数据到u ...

  3. iOS 8.0正式公布啦

    从昨晚開始,苹果新版移动操作系统iOS 8.0開始提供免费下载服务.新版操作系统提供有数百个新功能,当中包含相机功能中添加了延时摄影模式,能够使用其它厂商开发的输入法.购买的App应用程序能够与最多6 ...

  4. 如何在其他类中实现继承自CFormView类的对象

    今天项目开发中,我们创建了一个对话框资源,并创建了一个派生自CFormView的类(假设为CMyClassDlg)来管理它. CMyClassDlg.h #pragma once // CMyClas ...

  5. Python下载Bing主页图片

    直接上代码: # -*- coding: cp936 -*- import urllib import os print 'Download data......' url = 'http://cn. ...

  6. sql server 2005中没有等于等于,高手自行跳过。。

    set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER TRIGGER [qiandaoTrigger] ON [dbo].[bbsQianDao] AFT ...

  7. ORACLE恢复误删除的对象(表、存储过程等)

    1.恢复存储过程 原理就是利用了oracle里所有的存储过程的源代码都是存在dba_source里,而drop某个存储过程的时候,oracle这里肯定要去dba_source里把相关的源代码给dele ...

  8. Binding 之ObjectDataProvider数据源

    ObjectDataProvider数据源它可以把对象作为数据源提供给Binding,可用于绑定函数, 实例如下 public partial class BindObiectDataProvider ...

  9. 菜鸟初试水--JQuery基础

    此文仅作入门级文章,望大神们高抬贵手! JQuery: 它是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作. JQuery的用途: ①访问和操作DOM元素: 使用j ...

  10. 浅谈Spring(二)

    一.AOP编程(面向切面编程) AOP的本质是代理. 1.静态代理设计模式 概念:通过代理类为原始类增加额外功能. 代理类 = 原始类 + 额外功能 +实现原始类的相同接口. 优点:避免原始类因为额外 ...