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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 22.03.2009 20:52
Сообщение #2


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 
 К началу страницы 
+ Ответить 

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


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

 



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