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 .
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!