Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.19;
Скачать: CL | DM;

Вниз

Помогите решить задачу. Проблема чисто техническая.   Найти похожие ветки 

 
Glex ©   (2006-01-27 17:06) [0]

Задача C."Треугольник" (15 баллов)

Исходный текст программы: Cnn.PAS | Cnn.C | Cnn.CPP | Cnn.BAS

Входной файл: INPUT.TXT.  Выходной файл: OUTPUT.TXT.

Ограничение по времени: 1 секунда на тест

Дан треугольник из чисел. Напишите программу, которая находит наибольшую сумму чисел, расположенных на пути, начинающемся в верхней точке треугольника и заканчивающемся на основании треугольника. Каждый шаг может осуществляться вниз по диагонали влево или вниз по диагонали вправо.

Вход.  Входной файл содержит несколько строк. В первой строке записано целое число N (1<=N<=100) - количество строк треугольника. В следующих N строках файла содержатся строки треугольника, состоящие из 1, 2, ..., N чисел. Все числа целые и не превосходят по модулю 1000000.

Выход. В выходной файл следует вывести найденную максимальную сумму.

Примеры входа и выхода

input.txt

output.txt

3

11

 1



2 3



5 7 6



input.txt

output.txt

5

37

     1



    2  3



  5  7   6



-11 -3  0  9



40  1  2  3  4
---------------------

Условие с нормальным оформлением: http://www.edu.baltinform.ru/data/smod/MTape/3/29/PROBLEMS.htm

В общем, я придумал решать так:

1) Загружаем данные в массив
procedure readdata;
var i, j: byte;
t: array of array of integer;
begin
Assign(input, "input.txt");
Reset(input);
Readln(input, N);
setlength(t,N);
for i:=0 to N-1 do setlength(t[i],i+1);

for i:=0 to N-1 do begin
 for j:=0 to i do begin
   read(input, t[i][j]);
   end;
 readln(input);
 end;
close(input);
end;

Работает

2) Создаём из массива бинарное дерево.

3) Делаем обход до последнего уровня веток с вычислением суммы, каждый раз занося результат в массив.

4) Выбираем наибольшее значение из массива и пишем в выходной файл.
--------------

Проблемы с шагом 2. Как реализовать такое бинарное дерево и работать с ним? Если подскажете, с шагом 3 наверное смогу и сам разобраться.

например, для треугольника
 1
2 3
5 7 6

Дерево должно быть

    1
   /  \
  2    3
 /\    /\
5  7  7  6

-------------

Никогда не работал с этим. Меня сейчас вы наверное пошлёте на ссылки и книжки)
Но буду очень признателен, если кто-нибудь напишет часть 2. Я честно пробовал, не получилось(


 
Glex ©   (2006-01-27 17:14) [1]

Наверное я написал слишком длинный пост и всем лень читать(


 
MBo ©   (2006-01-27 17:39) [2]

бинарное дерево создавать не нужно, просто логика обхода массива должна быть подобной.


 
Glex ©   (2006-01-27 18:04) [3]

MBo

Спасибо, попробую


 
Trilon1   (2006-01-27 18:13) [4]

Покажешь решение?
Просто интересно посмотреть.


 
MBo ©   (2006-01-27 18:45) [5]

Полный перебор (проще написать рекурсивно ) дает 2^(N-1) путей, т.е. экспоненциальный алгоритм, нереальный при больших N. Мне сдается, что это задача на динамическое программирование.


 
Glex ©   (2006-01-30 19:41) [6]

program Cnn;

{$APPTYPE CONSOLE}

uses
 SysUtils, StrUtils;

var
 N: byte;
 a: array of array of integer;
 RecursiveOdd: boolean;
 path: array of string;
 passcounter: int64;
 passtring: string;
 Sum, PrevSum: integer;
 Turn: boolean = true;

procedure readdata;
var i, j: byte;
begin
Assign(input, "input.txt");
Reset(input);
Readln(input, N);
setlength(a,N);
for i:=0 to N-1 do setlength(a[i],i+1);
 for i:=0 to N-1 do begin
   for j:=0 to i do begin
     read(input, a[i][j]);
     end;
 readln(input);
 end;
setlength(path, 2 shl (N-2));
close(input);
end;

function DecToBin(a: integer): integer;
var shag, ost: integer;
answ: string;
begin
if a=0 then result:=0 else begin
 while a <> 0 do begin
   ost:= a mod 2;
   a:= a div 2;
   answ:= intTostr(ost) +  answ;
   end;
 result:= strtoint(answ);
 end;
end;

procedure ArrayPass;
var i, j, k: integer;
prev: byte;
begin
for i:=0 to high(path) do begin
path[i]:= inttostr(DecToBin(i));
if length(path[i])<N-1 then for j:=1 to N-1-length(path[i]) do path[i]:= "0"+path[i];
 end;

for k:=0 to high(path) do begin
prev:=0;
j:=1;
Sum:= a[0][0];
for i:=1 to N-1 do begin
 if path[k][i]="0"
   then Sum:= Sum + a[j][prev]
   else begin
     Sum:= Sum + a[j][prev+1];
     inc(prev);
     end;
 inc(j);
 end;
if k=0 then PrevSum:=Sum;
if Sum>PrevSum then PrevSum:=Sum;
end;
end;

procedure evaluate;
begin
ArrayPass;
end;

procedure outdata;
begin
Assign(output, "output.txt");
Rewrite(output);
write(Output, PrevSum);
close(output);
end;

begin
 readdata;
 evaluate;
 outdata;
end.



Страницы: 1 вся ветка

Текущий архив: 2006.02.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
6-1131618116
Святослав
2005-11-10 13:21
2006.02.19
Где можно скачать компонент TSocketServer ?


9-1118075296
novouralsk
2005-06-06 20:28
2006.02.19
Помогите хорошим примером!


2-1139069561
Michael5
2006-02-04 19:12
2006.02.19
Вопрос по OpenGL, программа не работает, подскажите, в чем дело!


3-1135058468
jiny
2005-12-20 09:01
2006.02.19
Помогите со сводными таблицами


15-1138281134
ferr
2006-01-26 16:12
2006.02.19
Книга