You are on page 1of 8

Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 1 -

Bi ton ma trn con c tng In nht
(Maximum sub rectangle)
19/03/2010)


There are wavelengths that people cannot see, there are sounds
that people cannot hear, and maybe computers have thoughts
that people cannot think
Dr. Richard W. Hamming (1915-1998)
Qui hoc ng c c .
1. Bi ton ma trn con c tng In nht
c c c c c
c cc cc nguyn thuc khong [-127, 127] (1 < N, M 100)
c (gm cc phn t lin k ca ma tr u) c cc
c .
Ma tr u l

Th ma trn con c tng ln

Tng cc phn t ca ma trn kt qu 15 T ng hp c nhiu kt qu th
ch cn ly kt qu u tin.
Thut ton th nht cho thu n: chng ta xt ht tt c cc ma trn con
c th c ca ma tr u, tnh t ng ca chng v tm ra tng ln nht. Cc
b c gi c th d dng nhn thy rng thut ton ny s c phc tp O(N, M) = N
3
x
M
3
. Vi gi tr N = M = 100 phc tp thut ton s l O(N, M) = 10
2*3*2
= 10
12
, v tt
nhin con s ny l khng thc t i vi cc my PC hin nay.
T cc c
tm ma trn con c tng ln nht c
2. Thut ton 1: quy hoch ng da trn vic tnh trc tng ca cc ma trn
con xut pht t phn t v tr (0, 0).
Thut ton th nh gii quyt bi ton da trn vic xy dng mt m [][] c

,
0 i*j=0
[ ][ ]
[ ][ ]
r i c j
dp i j
d r c
< <


(1)
ng d[][] l mng cc phn t ca ma tr u (ch s 0).
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 2 -

Vic tnh cc gi tr ca m [][] c thc hin theo cng thc truy hi sau:
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]+d[i-1][j-1]; (2)
Vi m [][] c c ny chng ta c th c tng cc phn t ca mt
ma trn con nm t ct j ti ct j+col v t hng i ti hng i + row theo cng thc sau:
sum = dp[i+row+1][j+col+1] -dp[i+row+1][j]-dp[i][j+col+1] +dp[i][j]; (3)
Cc bn c th xem hnh minh h hi c c trn.
0, 0
n, m
i, j
col
row
i+row, j+col

K c c cn 4 vng lp l duyt qua tt c cc ma trn con c th
c ca ma tr u, tnh tng cc phn t trong ma trn con theo cng thc (3) trn
v tm ra tng ln nht.
C th thu c c
int findMax2(int n, int m) // O(N^2M^2)
{
int maxSum = d[0][0];
int sum;
int i, j;
int col, row;
// initial dp array
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1]+d[i-1][j-1];
cout << endl;
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 3 -

for(i=0;i<n;i++)
for(j=0;j<m;j++)
for(row=0;i+row<n;row++)
for(col=0;j+col<m;col++)
{
// watch out here in index of dp array
sum = dp[i+row+1][j+col+1]+dp[i][j]-dp[i+row+1][j]-dp[i][j+col+1];
if(sum>maxSum)
maxSum = sum;
}
return maxSum;
}
Thu c phc tp O(N, M) = N
2
x M
2
ng h = = 100
phc tp c th l 10
8
, con s ny l c th chp nh c (ch c n 0,5
giy).
3. Bi ton dy con c tng ln nht v thut ton Kadane cho mng 1 chiu
Tc khi xem xt thut ton th 2 cho bi ton chng ta s xem xt bi ton tm dy
con (gm cc phn t lin tip nhau) c tng ln nht trong mt mng mt chiu v thut
ton Kadane (Joseph B. Kadane - http://lib.stat.cmu.edu/~kadane/) cho bi ton ny.
Thut ton Kadane s dng k thut quy hoc gii quyt bi ton
theo cng thc truy hi sau:
for x in a[0..n-1]
temp_max = max(0, temp_max) + x;
max_sum = max(max_sum, temp_max);
gi tr 0 c ng hp mng khng c phn t no (tng cc phn t c x
nh 0) c li gi tr ln nht ca mng tnh ti phn t x s l gi tr ln nh t
c vi mng gm cc phn t c x cng thm vi x.
t c th cho thu
int max_subarray(int a[], int n)
{
// end v start l hai bin ton cc ghi li v tr b u v kt thc ca nghim
// thut ton Kadane
int temp_max = 0;
int max_sum = 0;
int i, temp_start = 0;
for(i=0;i<n;i++)
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 4 -

{
temp_max += a[i];
if(temp_max<0)
{
temp_max = 0;
temp_start = i+1;
}
if(temp_max>max_sum)
{
start = temp_start;
end = i;
max_sum = temp_max;
}
}
return max_sum;
}
Thu c phc tp O(N) = N.
4. Thut ton Kadane cho bi ton tm ma trn con c tng ln nht.
By gi chng ta s p dng thut ton Kadane cho bi ton tm ma trn con (hai mt
mng hai chiu) c tng ln nht. Ta xem mi ma trn con a[0..n-1, col..(col+span)] gm cc
phn t a[][] chy t hng 0 (b u) ti hng n-1 (kt thc) v t ct col ti ct col+span
ca ma tr u l mt mng mt chiu vi cc phn t l tng ca cc phn t trn
mt hng ca ma tr c c l:
owSum[ ow] [ ow][ ]
col j col span
r r a r j
s s +


K ng thut ton Kadane cho mng mt chiu rowSum[] ta s c mng
con gm cc phn t lin tip c tng ln nht ca m c n con c
tng ln nht ca ma trn con a[0..n-1][col..(col+span)], v cho bin col chy t 0 ti m-1 ta
s c kt qu ca bi ton l gi tr ln nh c qua mi ln lp.
Cc bn c th xem qua hnh minh ha sau:
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 5 -

0, 0
n, m
X c c
span
c + span
sumRow[0]
sumRow[1]
sumRow[n-1]

t c th ca thut ton (bng ngn ng C++) l:
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;
const int MAXN = 5000;
const int MAXVAL = 30;
int d[MAXN][MAXN];
int dp[MAXN][MAXN];
int rowSum[MAXN]; // sum of row
void genTest(int n, int m);
// gen data for array d[0..n-1][0..m-1]
void printArray(int i, int j, int n, int m);
int topLeftX, topLeftY, botRightX, botRightY; // location of result
int findMax(int n, int m); // O(NM^2)
int n, m;
int main()
{
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 6 -

clock_t st, et;
n = m = 100;
genTest(n, m);
//printArray(0, 0, n, m);
cout << endl;
st = clock();
cout << findMax(n, m) << endl;
et = clock();
cout << "Thoi gian:" << (et-st)/CLK_TCK;
system("pause");
return 0;
}
int findMax(int n, int m)
{
int col, row, span;
int maxSum = d[0][0];
int sum;
int temp_start;
for(col=0;col<m;col++)
{
// fix column col
// init rowSum array
memset(rowSum,0, n*sizeof(int));
for(span=0;span+col<m;span++)
{
sum = 0;
// colum: span+col
// recalculate rowSum array
for(row=0;row<n;row++)
rowSum[row] += d[row][col+span];
temp_start = 0; // row 0
for(row=0;row<n;row++)
{
sum += rowSum[row];
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 7 -

if(sum<0)
{
temp_start = row+1;
sum = 0;
}
if(sum>maxSum)
{
maxSum = sum;
topLeftX = temp_start;
topLeftY = col;
botRightX = row+1;
botRightY = col+span+1;
}
}
}
}
return maxSum;
}
void genTest(int n, int m)
{
srand((int)time(NULL));
int i, j;
for(i=0;i<n;++i)
for(j=0;j<m;++j)
d[i][j] = (rand()%MAXVAL) - MAXVAL/2;
}
void printArray(int i, int j, int n, int m)
{
int i1, j1;
for(i1=i;i1<n;++i1)
{
for(j1=j;j1<m;++j1)
cout << d[i1][j1] << " ";
cout << endl;
Bi ton ma trn con c tng ln nht Nguyn Hu Tun

tuannhtn@yahoo.com - 8 -

}
}
Mc t sc thn trng v xem xt k cc g bi vit, tuy
vy vn c th khng trnh khi cc sai st, rt mong nh c s n ca
cc b c gi. Mi gp , thc mc xin gi v a ch email: tuannhtn@yahoo.com.
Hi Phng, ngy 14, thng 03, m 2010

Nguyn Hu Tun

You might also like