吃西瓜
【问题描述】
老胡买了是长方体形的西瓜来犒劳大家....
这块西瓜长m厘米,宽n厘米,高h厘米.他发现如果把这块西瓜平均地分成m*n*h块1立方厘米的小正方体,那么每一小块都会有一个营养值(可能为负,因为西瓜是有可能坏掉的,但是绝对值不超过200)。
现在老胡决定从这mnh立方厘米的西瓜中切出mm*nn*hh(0<=mm<=m,0<=nn<=n,0<=hh<=h)立方厘米的一块小西瓜(一定是立方体形,长宽高均为整数),送给该场比赛最高分获得者补充营养。他想知道他最多能获得多少营养值。
换句话说,我们希望从一个m*n*h的三维矩阵中,找出一个三维子矩阵,这个子矩阵的权和最大.
一个2*3*4的例子,最优方案为切红色2*3*1部分。
【文件输入】matrix.in
首行三个正整数h,m,n(注意顺序),分别表示西瓜的高,长,宽.
以下h部分,每部分是一个m*n的矩阵,第i部分第j行的第k个数表示西瓜第i层,第j行第k列的那块1立方厘米的小正方体的营养值.
【文件输出】matrix.out
老胡所能得到的最大营养值
解法
一道超简单的水题
创建一个三维数组
直接循环即可轻松解决
#include<bits/stdc++.h>
using namespace std;
int h,m,n;
int main()
{
int wat[33][51][51]={0};
cin>>h>>m>>n;
for(int i=1;i<=h;i++){
for(int j=1;j<=m;j++){
for(int k=1;k<=n;k++){
cin>>wat[i][j][k];
}
}
}
int anss=0;
int ans=-10000;
for(int i=1;i<=h;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=n;k++)
{
anss+=wat[i][j][k];
}
}
ans=max(ans,anss);
anss=0;
}
anss=0;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=h;j++)
{
for(int k=1;k<=n;k++)
{
anss+=wat[j][i][k];
}
}
ans=max(ans,anss);
anss=0;
}
anss=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=h;j++)
{
for(int k=1;k<=m;k++)
{
anss+=wat[j][k][i];
}
}
ans=max(ans,anss);
anss=0;
}
cout<<ans;
return 0;
}
标签:正方体,西瓜,题目,立方厘米,int,矩阵,c++,一个三维
From: https://www.cnblogs.com/demc/p/16906148.html