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

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

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

> матрицы, нахождение в матрице подматрицы
ted
сообщение 22.03.2009 1:38
Сообщение #1


Новичок
*

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

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


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


Гость






Рекурсивно - вот так, например:
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.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



- Текстовая версия 18.07.2025 14:14
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"