【動態規劃】吃西瓜
来源:互联网 发布:laura marling知乎 编辑:程序博客网 时间:2024/04/28 03:20
[说明]此题中出现的所有数全为整数[背景]SubRaY有一天得到一块西瓜,是长方体形的....[题目描述]SubRaY发现这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200).现在SubRaY决定从这m*n*h立方厘米的西瓜中切出mm*nn*hh立方厘米的一块小西瓜(一定是立方体形,长宽高均为整数),然后吃掉它.他想知道他最多能获得多少营养值.(0<=mm<=m,0<=nn<=n,0<=hh<=h.mm,nn,hh的值由您来决定).换句话说,我们希望从一个m*n*h的三维矩阵中,找出一个三维子矩阵,这个子矩阵的权和最大.一个2*3*4的例子,最优方案为切红色2*3*1部分[数据范围]对于30%的数据,h=1,1<=m,n<=10对于全部的数据,1<=h<=32,1<=m,n<=50,保证h<=m,n输入格式首行三个数h,m,n(注意顺序),分别表示西瓜的高,长,宽.以下h部分,每部分是一个m*n的矩阵,第i部分第j行的第k个数表示西瓜第i层,第j行第k列的那块1立方厘米的小正方体的营养值.输出格式SubRaY所能得到的最大营养值样例输入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样例输出45
此題為一個求最大子立方的裸題。在下面代碼中,立方是n * m * h的,用s[i][j][k]表示第j行第k列前i層的和。
先枚舉i1,i2即從第i1+1層到第i2層。用s[j][k]表示這幾層中第k列前j層的和,再枚舉j1,j2即從第j1+1行到j2行,那麼用一次O(h)的枚舉就可以求出i1+1到i2層中j1+1行到j2行的最大和。
求區間最大子序列的方法略。
ACCode:
#include <cstdio>#include <string>int s[60][60][60];int x[60][60][60];int s1[60][60];int n, m, h, ans = -0x7fffff00;int main(){ freopen("rqnoj93.in", "r", stdin); freopen("rqnoj93.out", "w", stdout); scanf("%ld%ld%ld", &n, &m, &h); for (int i = 1; i < n + 1; ++i) for (int j = 1; j < m + 1; ++j) for (int k = 1; k < h + 1; ++k) scanf("%ld", &x[i][j][k]); for (int i = 1; i < n + 1; ++i) for (int j = 1; j < m + 1; ++j) for (int k = 1; k < h + 1; ++k) s[i][j][k] = s[i - 1][j][k] + x[i][j][k]; for (int i1 = 0; i1 < n; ++i1) for (int i2 = i1 + 1; i2 < n + 1; ++i2) { memset(s1, 0, sizeof(s1)); for (int j = 1; j < m + 1; ++j) for (int k = 1; k < h + 1; ++k) s1[j][k] = s1[j - 1][k] + s[i2][j][k] - s[i1][j][k]; for (int j1 = 0; j1 < m; ++j1) for (int j2 = j1 + 1; j2 < m + 1; ++j2) { int tmp = s1[j2][1] - s1[j1][1]; for (int k = 2; k < h + 1; ++k) { tmp = std::max(tmp, 0); tmp += s1[j2][k] - s1[j1][k]; ans = std::max(tmp, ans); } } } printf("%ld", ans); return 0;}
- 【動態規劃】吃西瓜
- 【吃西瓜】解题报告
- 【动态规划】【RQNOJ】吃西瓜
- 吃了个大西瓜
- rnqoj-93-吃西瓜-dp
- 吃西瓜的刘备
- 其实人是有潜力的,比如吃西瓜
- 【DP~最大子立方体】吃西瓜
- 女人什么情况下不宜吃西瓜
- 解析:吃西瓜的好处与禁忌
- 【最大立方体和】吃西瓜rqnoj93
- codeforces-4A-Watermelon( 吃西瓜==吃水果 )
- [健康小常识]解暑吃西瓜六大禁忌
- cocos2dx视频教程进阶篇--第1天--吃西瓜游戏。
- 西瓜
- 西瓜
- [健康小常识]夏季每日吃半个西瓜可降温解暑抗衰老
- 动态规划 RQNOJ 吃西瓜 最大子段和三维版
- hdu 2035
- 【吃西瓜】解题报告
- SAX读取XML文件
- 【完美的牛栏】二分图匹配
- (2011.11.10) 汇编_王爽_第17章_学习小结
- 【動態規劃】吃西瓜
- LIBSVM做回归预测
- 93. Can't see the wood for the trees. 一叶障目,不见泰山
- Oracle 数据库索引监控 注意事项
- 另一篇 Oracle索引监控
- 推荐网上编程教程,适应零基础:javascript、python、ruby 、java 、andriod
- Android Layout 之 RelativeLayout,代码实现相对布局
- JSTL——核心标签
- 听说CODEgoogle要关闭