您的位置:首页 > 其它

FOJ 1018 Maximal Sum

2011-01-08 13:59 225 查看
本题的中文描述:

给定一个由N*N*N 个整数组成的立方体,定义其和为N*N*N个数的和。现在,给你一个N*N*N 个整数组成的立方体,请你从中找出一个和最大的子长方体(可与给定的立方体相同)。
例如,对于立方体:
0 -1 3
-5 7 4
-8 9 1

-1 -3 -1
2 -1 5
0 -1 3

3 1 -1
1 3 2
1 -2 1
其和最大的子长方体为:
7 4
9 1

-1 5
-1 3

3 2
-2 1
它的和为31。

本题是三维的情况,二维情况为求最大子矩阵问题,一维的情况为最大子段和问题。。。

二维版的问题,poj 1050,大家可以参考这篇解题报告。http://www.slyar.com/blog/poj-1050-cpp.html

本题的情况就是先求出子矩阵,然后再转换成POJ 1050的解法,就行了。。

WA了好几次,郁闷,题目没看懂。。ORZ。。

#include <iostream>
using namespace std;

int cube[20][20][20];
int area[20][20];
int num[20];

int main()
{
int n,i,j,k,p,q,max,sum,cnt;
while(scanf("%d",&n)&&n)
{
cnt=-200;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
for(k=0;k<n;++k)
scanf("%d",&cube[i][j][k]);
}
}
for(p=0;p<n;++p)
{
memset(area,0,sizeof(area));
for(q=p;q<n;++q)
{
for(i=0;i<n;++i)
{
for(j=0;j<n;j++)
area[i][j]+=cube[q][i][j];
}
for(i=0;i<n;++i)
{
memset(num,0,sizeof(num));
for(j=i;j<n;++j)
{
for(k=0;k<n;++k)
num[k]+=area[j][k];
max=-200;
sum=0;
for(k=0;k<n;++k)
{
if(sum>0)
sum+=num[k];
else
sum=num[k];
if(sum>max)
max=sum;
}
if(max>cnt)
cnt=max;
}
}
}
}
printf("%d/n",cnt);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: