动态规划 RQNOJ 吃西瓜 最大子段和三维版
2015-05-08 13:11
260 查看
题目描述
[说明]此题中出现的所有数全为整数[背景]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的三维矩阵中,找出一个三维子矩阵,这个子矩阵的权和最大.
![](http://www.rqnoj.cn/ProblemPic/P93.jpg)
一个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所能得到的最大营养值
样例输入
样例输出
三维状态图像题目很明了~
[cpp] view
plaincopy
#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;
}
相关文章推荐
- DP 动态规划 Problem C 1003 最大递增子段和
- POJ 2479 动态规划 最大子段和
- 动态规划,最大子段和
- A - Max Sum Plus Plus HDU1024 ( 动态规划 多段连续子段和的最大值)
- 动态规划求解最大子段和
- 最大子段和——分治与动态规划
- 最大子段-n上找m个子段的和为最大-动态规划-二维dp+滚动数组dp优化
- 动态规划求解最大子段问题的最优解
- 【动态规划】最大m子段和
- POJ 2593 动态规划 最大子段和
- Sum Of SubRectangular Parallelepiped 三维最大子段和
- 动态规划小结(1)最大子段和
- HDU1087 Super Jumping! Jumping! Jumping!(动态规划,最大递增子段和)
- |洛谷|动态规划|P1115 最大子段和
- 0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
- POJ2018 Best Cow Fences——二分答案+贪心(动态规划)求最大子段和——pku2018
- hoj 2555 三维最大子段和
- 最大子段和——分治与动态规划
- 最大子段和——分治与动态规划
- C语言最大子段和问题(动态规划)