Помощь - Поиск - Пользователи - Календарь
Полная версия: матрицы
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ted
Помогите решить задачу, очень надо.
Дана матрица а(m/n). Найдите в ней прямоугольную подматрицу, сумма элементов которой максимальна. Задачу решить с помощью рекурсии.
klem4
Отчет очевиден - матрица m * n от элемента [0,0].

Чего-то в условии хватает.
volvo
Неправда... Не все так очевидно:
-1 -2 -3
-5 2 3
6 7 8
klem4
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.
volvo
Рекурсивно - вот так, например:
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.
ted
Спасибо !!!!!!!!!!
ted
У меня ещё небольшой вопрос по этой задче, как сделать так чтобы она считала суммы элементов каждой подматрицы,сравнивала их и выводила самый большой. Зарание спасибо!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.