Nguồn đề bài: http://vn.spoj.com/problems/QBRECT/
Đề bài QBRECT spoj
Cho một bảng kích thước MxN, được chia thành lưới ô vuông đơn vị M dòng N cột ( 1 <= M, N <= 1000 )
Trên các ô của bảng ghi số 0 hoặc 1. Các dòng của bảng được đánh số 1, 2… M theo thứ tự từ trên xuống dưới và các cột của bảng được đánh số 1, 2…, N theo thứ tự từ trái qua phải
Yêu cầu:
Hãy tìm một hình chữ nhật gồm các ô của bảng thoả mãn các điều kiện sau:
1 – Hình chữ nhật đó chỉ gồm các số 1
2 – Cạnh hình chữ nhật song song với cạnh bảng
3 – Diện tích hình chữ nhật là lớn nhất có thể
Input
Dòng 1: Ghi hai số M, N
M dòng tiếp theo, dòng thứ i ghi N số mà số thứ j là số ghi trên ô (i, j) của bảng
Output
Gồm 1 dòng duy nhất ghi diện tích của hình chữ nhật tìm được
Example
Input:
11 13
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 1 1 1 1 1 1 1 1 1 0 0 0
1 1 1 1 1 1 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 1 1 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 1 1 1 1 1 1 1 0 0 0 0
0 0 0 0 1 1 1 0 0 0 0 1 1
0 0 0 0 0 1 0 0 0 0 0 1 1
Output:
49
THUẬT TOÁN
code pascal
const fi=''; nmax=1000; type data=longint; var f:text; A:array[0..nmax+1,0..nmax+1] of byte; n,test,m:data; sta:data; H:array[0..nmax*nmax+1] of data; D,L,R:array[0..nmax+1] of data; procedure docfile; var i,j:data; begin assign(f,fi);reset(f); readln(f,m,n); for i:=1 to m do for j:=1 to n do read(f,a[i,j]); close(f); end; function xem:data; begin exit(h[sta]); end; procedure them(x:data); begin inc(sta); h[sta]:=x; end; function lay:data; begin lay:=h[sta]; dec(sta); end; procedure xuli; var i,j,res,dt:data; begin fillchar(d,sizeof(d),0); res:=0; sta:=0; for i:=1 to m do begin for j:=1 to n do if a[i,j]<>1 then d[j]:=i; sta:=0; for j:=1 to n do begin while (sta>0) and (D[xem]<=D[j]) do lay; if sta=0 then L[j]:=0 else L[j]:=xem; them(j); end; sta:=0; for j:=n downto 1 do begin while (sta>0) and (d[xem]<=d[j]) do lay; if sta=0 then R[j]:=n+1 else R[j]:=xem; them(j); end; for j:=1 to n do begin dt:=(i-d[j])*(R[j]-L[j]-1); if dt>res then res:=dt; end; end; writeln(res); end; begin docfile; xuli; readln; end.
code c++
#include <iostream> #include <fstream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <algorithm> using namespace std; #define maxn 1010 int n , m , a[maxn][maxn]; int h[maxn] , l[maxn] , r[maxn] , res; int main() { scanf("%d%d",&m,&n); for (int i=1;i<=m;i++) for (int j=1;j<=n;j++) scanf("%d",&a[i][j]); h[0] = -1; h[n+1] = -1; for (int i=1;i<=m;i++) { for (int j=1;j<=n;j++) h[j] = a[i][j] * (h[j] + 1); for (int j=1;j<=n;j++) { l[j] = j; while (h[l[j]-1] >= h[j]) l[j] = l[l[j]-1]; } for (int j=n;j>0;j--) { r[j] = j; while (h[r[j]+1] >= h[j]) r[j] = r[r[j]+1]; } for (int j=1;j<=n;j++) res = max(res,h[j]*(r[j]-l[j]+1)); } printf("%d",res); }
bài viết gì mà thuật toán với code kí hiệu lung tung beng xà quần làm người đọc khó hiểu!! @@~
:v mỗi ng có 1 cách code riêng thôi mà!
Tụi nó bạn anh á em, tụi nó trolll ý :v
:v
xin lỗi! đặt biến chứ không phải kí hiệu, đặt biến lung tung lộn xộn rối beng rối nùi hà~~
What’s a very very bad and borin’ post! I don’t know what r u talkin’ about… The explainations is too complex
(LIKE)
Bài này nếu giải bằng QHĐ thì phải chia ra 2 lần tính như dãy lồi, tính chiều dài và chiều rộng hả a? Hay là có CT QHĐ ạ????
thế ban đầu h[j] bằng bao nhiêu thế,vs j=1 ý