Rezolvare completă PbInfo #2435 fadema

Corina a cumpărat de la magazin un material din pânză colorată, de formă dreptunghiulară pentru a decupa din el o față de masă pentru masa din bucătărie. Fiindcă este pasionată de șah, Corina a ales un material format din n x m pătrate de aceeași dimensiune colorate cu alb sau negru. Pătratele sunt lipite și sunt dispuse pe linii și coloane paralele cu laturile dreptunghiului din pânză care a fost cumpărat. Două pătrate se numesc vecine dacă au în comun o latură. Materialul din pânză nu respectă neapărat structura unei table de șah, adică pătratele vecine pe aceeași linie sau pe aceeași coloană nu sunt în mod necesar colorate în mod alternativ.
Corina își propune prin urmare să decupeze un dreptunghi cu un număr maxim de pătrate, paralel cu laturile dreptunghiului din pânză care a fost cumpărat, care să respecte alternanța culorilor pe o tablă de șah.

Cerința

Să se determine numărul maxim de pătrate întregi ale unui dreptunghi cu laturile paralele cu cele ale materialului cumpărat, care poate fi decupat astfel încât să nu existe două pătrate vecine având aceeași culoare.

Date de intrare

Fișierul de intrare fadema.in conține pe prima linie două numere naturale n și m reprezentând numărul de linii, respectiv numărul de coloane ale materialului din pânză care a fost cumpărat. Pe fiecare dintre următoarele n linii se află câte m cifre 0 sau 1 despărțite prin câte un spațiu, reprezentând culorile pătratelor materialului. Cifra 0 codifică culoarea albă, iar cifra 1 codifică culoarea neagră.

Date de ieșire

Fișierul de ieșire fadema.out va conține pe prima linie un singur număr natural A, reprezentând numărul maxim de pătrate ale unui dreptunghi care poate fi decupat astfel încât să respecte cerința din enunț. Dacă nu există dreptunghiuri cu cel puțin două pătrate având culori alternante, se va scrie valoarea 1.

Restricții și precizări

  • 2 ≤ N ≤ 1000
  • 2 ≤ M ≤ 1000
  • Pentru rezolvarea corectă a cerinței respectând restricțiile problemei se acordă 90 de puncte,
  • Pentru rezultate corecte respectând restricțiile problemei și n, m ≤ 100 se acordă 20 de puncte
  • Pentru rezultate corecte respectând restricțiile problemei și n, m ≤ 200 se acordă 40 de puncte
  • Pentru rezultate corecte respectând restricțiile problemei și n, m ≤ 400 se acordă 65 de puncte
  • În concurs s-au acordat 10 puncte din oficiu. Aici se acordă 10 puncte pentru exemplele din enunț.

Exemplul 1:

fadema.in

3 4 
0 0 1 0 
1 1 0 0 
1 0 1 0

fadema.out

6

Explicație

Dreptunghiul delimitat de liniile 1 și 3, respectiv coloanele 2 și 3 are 6 pătrate.

Exemplul 2:

fadema.in

4 5 
0 1 1 0 1
1 0 1 0 1
0 0 1 1 0
1 1 0 1 1

fadema.out

5

Explicație

Dreptunghiul delimitat de linia 2, respectiv coloanele 1 și 5 are 5 pătrate.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema fadema:

// Prof Marcel Dragan
// Colegiul National Samuel von Bruckenthal
// Complexitate: O(n^2)

#include <fstream>
using namespace std;
ifstream in("fadema.in");
ofstream out("fadema.out");

short n,m,a[1001][1001],mr1[1001][1001],mr2[1001][1001],mc[1001][1001],mc1[1001][1001],mc2[1001][1001];

int main()
{
    in>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            in>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=m;j>0;j--){
            if(j==m){
                mr2[i][j]=1;
            }
            else{
                if(a[i][j]+a[i][j+1]==1){
                    mr2[i][j]=mr2[i][j+1]+1;
                }
                else{
                    mr2[i][j]=1;
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j==1){
                mr1[i][j]=1;
            }
            else{
                if(a[i][j]+a[i][j-1]==1){
                    mr1[i][j]=mr1[i][j-1]+1;
                }
                else{
                    mr1[i][j]=1;
                }
            }
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i==1){
                mc1[i][j]=mr1[i][j];
                mc2[i][j]=mr2[i][j];
                mc[i][j]=1;
            }
            else{
                if(a[i][j]+a[i-1][j]==1){
                    mc1[i][j]=min(mc1[i-1][j],mr1[i][j]);
                    mc2[i][j]=min(mc2[i-1][j],mr2[i][j]);
                    mc[i][j]=mc[i-1][j]+1;
                }
                else{
                    mc1[i][j]=mr1[i][j];
                    mc2[i][j]=mr2[i][j];
                    mc[i][j]=1;
                }
            }
        }
    }
    int M=1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(M<mc[i][j]*(mc1[i][j]+mc2[i][j]-1))
                M=mc[i][j]*(mc1[i][j]+mc2[i][j]-1);
        }
    }
    out << M << endl;
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2435 fadema

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2435 fadema de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!