【动态规划】【RQNOJ】吃西瓜
2010-07-04 10:55
302 查看
题目描述
[说明]此题中出现的所有数全为整数[背景]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所能得到的最大营养值样例输入
#include<stdio.h> #include<iostream> using namespace std; int h,m,n,i,j,k; int s[51][51][51],a[51][51][51],f[51][51][51][51]; int ans; int main() { scanf("%d%d%d",&h,&m,&n); for (i=1;i<=h;++i) for (j=1;j<=m;++j) for (k=1;k<=n;++k) { scanf("%d",&a[i][j][k]); s[i][j][k]=s[i][j-1][k]+s[i][j][k-1]-s[i][j-1][k-1]+a[i][j][k]; } for (int sj=1;sj<=m;++sj) for (int sk=1;sk<=n;++sk) for (int ej=sj;ej<=m;++ej) for (int ek=sk;ek<=n;++ek) { f[sj][sk][ej][ek]=-99999; for (i=1;i<=h;++i) { int tem=s[i][ej][ek]-s[i][sj-1][ek]-s[i][ej][sk-1]+s[i][sj-1][sk-1]; f[sj][sk][ej][ek]=max(f[sj][sk][ej][ek]+tem,tem); if (f[sj][sk][ej][ek]>ans) ans=f[sj][sk][ej][ek]; } } printf("%d/n",ans); return 0; }
相关文章推荐
- 【解题报告】[动态规划] RQNOJ - PID273 / 马棚问题
- 【动态规划】【RQNOJ】最佳课题选择
- 【动态规划】【RQNOJ】购物问题
- 【动态规划】【RQNOJ】科技庄园
- 【动态规划】逃亡的准备rqnoj98
- 【解题报告】[动态规划] RQNOJ - PID105 / 核电站问题
- 【动态规划】【RQNOJ】装箱问题
- 【动态规划】【RQNOJ】纪念品分组【恶搞版】
- 【动态规划】【RQNOJ】方格取数
- 【动态规划】【RQNOJ】可怜的Oliver
- 【动态规划】逃亡的准备rqnoj98
- 吃西瓜 最大子矩阵 三维的。 rqnoj93
- 【解题报告】[动态规划] RQNOJ - PID38 / 串的记数
- 【动态规划】【RQNOJ】可怜的Oliver
- RQNOJ PID302 / [NOIP2001]统计单词个数 (动态规划)
- 【解题报告】[动态规划] RQNOJ - PID15 / 采药
- 【动态规划】【RQNOJ】庆功会
- 【动态规划】【RQNOJ】大地的秘密
- 【动态规划】【RQNOJ】刘翔!加油!
- 【动态规划】【RQNOJ】[AHOI1997]彩旗飘飘