IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> матрицы, нахождение в матрице подматрицы
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Помогите решить задачу, очень надо.
Дана матрица а(m/n). Найдите в ней прямоугольную подматрицу, сумма элементов которой максимальна. Задачу решить с помощью рекурсии.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Отчет очевиден - матрица m * n от элемента [0,0].

Чего-то в условии хватает.

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Неправда... Не все так очевидно:
-1 -2 -3
-5 2 3
6 7 8
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


volvo, точно, поторопился я с выводом.

Если у автора есть тестовые примеры пусть приводит, особо не тестил, но думаю ошибок быть не должно.

const max_rows = 10; max_cols = 10;
type tarr = array[1..max_rows, 1..max_cols] of integer;

procedure init( var arr: tarr );
var i, j: integer;
begin
randomize;
for i := 1 to max_rows do
for j := 1 to max_cols do arr[i, j] := random(21) - 10
end;

procedure dump( const arr: tarr; const left_r, left_c, rows, cols: integer);
var
i, j, stop_r, stop_c: integer;
begin
stop_r := left_r + rows - 1;
if stop_r > max_rows then stop_r := max_rows;

stop_c := left_c + cols - 1;
if stop_c > max_cols then stop_c := max_cols;

for i := left_r to stop_r do begin
writeln;
for j := left_c to stop_c do write( arr[i, j]:4 );
end;
writeln
end;

function sum ( const arr: tarr; const left_r, left_c,
rows, cols: integer ): integer;
var
i, j, stop_r, stop_c, _sum: integer;
begin
_sum := 0;

stop_r := left_r + rows - 1;
if stop_r > max_rows then stop_r := max_rows;

stop_c := left_c + cols - 1;
if stop_c > max_cols then stop_c := max_cols;

for i := left_r to stop_r do
for j := left_c to stop_c do inc(_sum, arr[i, j]);
sum := _sum;
end;

procedure solve( const arr: tarr; var r_row, r_col,
rr_count, rc_count: integer);
var
last_max, rows, cols, lr, lc, curr_sum: integer;
begin
last_max := -maxint;
for rows := max_rows downto 1 do
for cols := max_cols downto 1 do
for lr := 1 to max_rows - rows + 1 do
for lc := 1 to max_cols - cols + 1 do begin
curr_sum := sum( arr, lr, lc, rows, cols );
if curr_sum > last_max then begin
last_max := curr_sum;
r_row := lr;
r_col := lc;
rr_count := rows;
rc_count := cols;
end;
end;
end;

var arr: tarr; rows, cols, r_row, r_col, rr_cnt, rc_cnt: integer;

begin
init(arr);
dump(arr, 1, 1, max_rows, max_cols);
solve(arr, r_row, r_col, rr_cnt, rc_cnt);
dump(arr, r_row, r_col, rr_cnt, rc_cnt);
end.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Рекурсивно - вот так, например:
const
max_rows = 3; max_cols = 3;
type
tarr = array[1 .. max_rows, 1 .. max_cols] of integer;

procedure print(const arr: tarr; si, sj, fi, fj: integer);
var i, j: integer;
begin
for i := si to fi do begin
for j := sj to fj do write(arr[i, j]:4);
writeln;
end;
end;

procedure run(const arr: tarr; var st_i, st_j, fn_i, fn_j: integer);

var
max_sum: integer;

procedure solve(si, sj, fi, fj: integer);

procedure check_sum;
var i, j, s: integer;
begin
s := 0;
for i := si to fi do
for j := sj to fj do s := s + arr[i, j];
if s > max_sum then begin
st_i := si; st_j := sj; fn_i := fi; fn_j := fj;
max_sum := s;
end;
end;

begin
if (si > max_cols) or (sj > max_rows) or
(fi > max_cols) or (fj > max_rows) then exit;
check_sum;

solve(si, sj, fi, fj + 1);
solve(si, sj, fi + 1, fj);
solve(si, sj + 1, fi, fj);
solve(si + 1, sj, fi, fj);
end;

begin
max_sum := -maxint;
solve(1, 1, 1, 1);
end;

const
arr: tarr = (
(-1, -2, 3),
(-6, 2, 23),
(-5, 7, 8)
);

var
st_i, st_j, fn_i, fn_j: integer;

begin
run(arr, st_i, st_j, fn_i, fn_j);
print(arr, st_i, st_j, fn_i, fn_j);
end.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Спасибо !!!!!!!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


У меня ещё небольшой вопрос по этой задче, как сделать так чтобы она считала суммы элементов каждой подматрицы,сравнивала их и выводила самый большой. Зарание спасибо!!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 2.09.2025 2:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name