Hướng dẫn giải của Khối lập phương lớn nhất


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const maxn=31;
var test,it,n,re:longint;
    a:array[1..maxn,1..maxn,1..maxn] of longint;
    f,x,y:array[0..maxn,0..maxn,0..maxn] of longint;

procedure rf;
var i,j,k:longint;
begin
     read(n);
     for i:=1 to n do
         for j:=1 to n do
             for k:=1 to n do
                 read(a[i,j,k]);
end;

procedure pr;
var i,j,k:longint;
begin
     for i:=1 to n do
         for j:=1 to n do
             for k:=1 to n do
                 y[i,j,k]:=y[i,j,k-1]+a[j,k,i];
     for i:=1 to n do
         for j:=1 to n do
             for k:=1 to n do
                 x[i,j,k]:=x[i,j,k-1]+y[k,i,j];
     for i:=1 to n do
         for j:=1 to n do
             for k:=1 to n do
                 f[i,j,k]:=f[i-1,j,k]+x[i,j,k];
end;

function max(x,y:longint):longint;
begin
     if x>y then max:=x else max:=y;
end;

procedure wf;
var i,j,k,ii,jj,kk,l:longint;
begin
     re:=-maxlongint;
     for l:=1 to n do
         for i:=1 to n-l+1 do
             for j:=1 to n-l+1 do
                 for k:=1 to n-l+1 do
                 begin
                      ii:=i+l-1; jj:=j+l-1; kk:=k+l-1;
                      re:=max(re,f[ii,jj,kk]-f[ii,jj,k-1]-f[ii,j-1,kk]-f[i-1,jj,kk]+f[ii,j-1,k-1]
                                 +f[i-1,jj,k-1]+f[i-1,j-1,kk]-f[i-1,j-1,k-1]);
                 end;
     writeln(re);
end;

begin
     read(test);
     for it:=1 to test do
     begin
          rf;
          pr;
          wf;
     end;
end.

Code mẫu của happyboy99x

#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std;

#define N 31
int a[N][N][N], f[N][N][N], n;

void enter() {
    scanf("%d",&n);
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            for(int k = 1; k <= n; ++k)
                scanf("%d", &a[i][j][k]);
}

inline int subRectangular(int a, int b, int c, int x, int y, int z) {
    return f[x][y][z] - f[a-1][y][z] - f[x][y][c-1] - f[x][b-1][z] + f[x][b-1][c-1]
        + f[a-1][y][c-1] + f[a-1][b-1][z] - f[a-1][b-1][c-1];
}

void dp() {
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            for(int k = 1; k <= n; ++k)
                f[i][j][k] = f[i-1][j][k] + f[i][j][k-1] + f[i][j-1][k] - f[i][j-1][k-1]
                    - f[i-1][j][k-1] - f[i-1][j-1][k] + f[i-1][j-1][k-1] + a[i][j][k];
}

int maxCub() {
    int res = INT_MIN;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
            for(int k = 1; k <= n; ++k)
                for(int sz = min(i, min(j, k)); sz > 0; --sz)
                    res = max(res, subRectangular(i-sz+1,j-sz+1,k-sz+1,i,j,k));
    return res;
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
#endif
    int tc; scanf("%d", &tc);
    while(tc--) {
        enter();
        dp();
        printf("%d\n", maxCub());
    }
    return 0;
}

Code mẫu của ladpro98

#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <climits>
#include <cstdlib>
#include <ctime>
#include <memory.h>
#include <cassert>
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define REP(i, a, b) for(int i = (a); i <=(b); i++)
#define FORD(i, a, b) for(int i = (a); i > (b); i--)
#define REPD(i, a, b) for(int i = (a); i >=(b); i--)
#define SZ(a) (int((a).size()))
#define ALL(a) (a).begin(), (a).end()
#define PB push_back
#define MP make_pair
#define LL long long
#define LD long double
#define II pair<int, int>
#define X first
#define Y second
#define VI vector<int>
const int N = 33;
using namespace std;
int a[N][N][N], F[N][N][N];
int n, ntest;

int main() {
    ios :: sync_with_stdio(0); cin.tie(0);
    cin >> ntest;
    while (ntest--) {
        cin >> n;
        REP(i, 1, n) REP(j, 1, n) REP(k, 1, n) cin >> a[i][j][k];
        REP(i, 1, n) REP(j, 1, n) REP(k, 1, n)
            F[i][j][k] = F[i - 1][j][k] + F[i][j - 1][k] + F[i][j][k - 1] + a[i][j][k] - F[i - 1][j - 1][k] - F[i][j - 1][k - 1] - F[i - 1][j][k - 1] + F[i - 1][j - 1][k - 1];
        int ans = 0;
        REP(i, 1, n) REP(j, 1, n) REP(k, 1, n) for(int l = 1; l <= i && l <= j && l <= k; l++)
            ans = max(ans, F[i][j][k] - F[i - l][j][k] - F[i][j - l][k] - F[i][j][k - l] + F[i - l][j - l][k] + F[i][j - l][k - l] + F[i - l][j][k - l] - F[i - l][j - l][k - l]);
        cout << ans << '\n';
    }
    return 0;
}

Code mẫu của RR

PROGRAM MaxCub;
CONST
  fi='';
  fo='';
  maxn=30;
VAR
  n:byte;
  t:array[0..maxn,0..maxn,0..maxn] of longint;
  f1,f2:text;
  kq:longint;
  timeold:longint;
  stop:boolean;
Procedure OpenFiles;
Begin
  Assign(f1,fi); Reset(f1);
  Assign(f2,fo); Rewrite(f2);
End;
Procedure CloseFiles;
Begin
  Close(f1); Close(f2);
End;
Procedure ReadInput;
Var
  k,i,j:byte;
  a:longint;
Begin
  Readln(f1,n);
  kq:=-maxlongint;
  stop:=true;
  For k:=1 to n do
    For i:=1 to n do
    begin
      For j:=1 to n do
      begin
        Read(f1,a);
        If a<0 then stop:=false;
        If a>kq then kq:=a;
        t[k,i,j]:=a+t[k-1,i,j]+t[k,i-1,j]+t[k,i,j-1]
                   -t[k-1,i-1,j]-t[k-1,i,j-1]-t[k,i-1,j-1]+t[k-1,i-1,j-1];
        If (i=j) and (j=k) then
          If t[k,i,j]>kq then kq:=t[k,i,j];
      end;
    end;
End;
Procedure Find;
Var
  v,i,j,k:byte;
  s:longint;
Begin
  For v:=1 to n-1 do
  begin
    For k:=0 to n-v-1 do
    For i:=0 to n-v-1 do
    For j:=0 to n-v-1 do
      begin
        s:=t[k+v+1,i+v+1,j+v+1]-t[k+v+1,i+v+1,j]-t[k+v+1,i,j+v+1]-t[k,i+v+1,j+v+1]
          +t[k+v+1,i,j]+t[k,i+v+1,j]+t[k,i,j+v+1]-t[k,i,j];
        If s>kq then kq:=s;
      end;
  end;
End;
Procedure WriteOutput;
Begin
  Writeln(f2,kq);
End;
Procedure Solve;
Var
  st,i:integer;
Begin
  OpenFiles;
  Readln(f1,st);
  For i:=1 to st do
  begin
    ReadInput;
    If not stop then Find;
    WriteOutput;
  end;
  CloseFiles;
End;
BEGIN
  Solve;
END.

Code mẫu của hieult

#include <cstdio>
//#include <conio.h>
#define  Max  33 

int Maxcub,Sum[Max][Max][Max],N; 
void nhap()
{
int Cube  ;
    Maxcub = -2147483647;   
    scanf("%d",&N);    
    for(int i = 1;i<=N;i++)
        {    
             for(int j = 1;j<=N;j++)    
                  for(int k = 1;k<=N;k++)    
                  {
                       scanf("%d",&Sum[i][j][k]);
                       Sum[i][j][k] = Sum[i][j][k] + Sum[i][j-1][k] + Sum[i][j][k-1] - Sum[i][j-1][k-1];
                  }
        for(int j = 1;j<=N;j++)    
        for(int k = 1;k<=N;k++)    
            Sum[i][j][k] = Sum[i][j][k] + Sum[i-1][j][k];
        }
}
int Vl(int i,int j,int k,int l)
{
    int S1,S2,S3;
    S1 = Sum[i+l][j+l][k-1] + Sum[i+l][j-1][k+l] - Sum[i+l][j-1][k-1];
    S2 = Sum[i-1][j+l][k+l] + Sum[i-1][j-1][k-1];
    S3 = Sum[i-1][j+l][k-1] + Sum[i-1][j-1][k+l];
    return Sum[i+l][j+l][k+l] - (S1 + S2 - S3);
}
void Solve()
{
int i,j,k,l,Cost;
for(int i = 1;i<=N;i++)    
    for(int j = 1;j<=N;j++)    
        for(int k = 1;k<=N;k++)    
            for(int l = 1;l<=N;l++)   
                if (i + l <= N && j + l <= N  && k + l <= N)
                {
                    Cost = Vl(i, j, k, l);
                    if (Cost > Maxcub) Maxcub = Cost;
                }       
}

int main()
{
    //freopen("MAXCUB.in","r",stdin);
    int test;
    scanf("%d",&test);
    for(int i = 1;i<=test;i++) 
    {
        nhap();
        Solve();
        printf("%d\n",Maxcub);
    }
    //getch();   
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.