Форум: "Начинающим";
Текущий архив: 2006.02.19;
Скачать: [xml.tar.bz2];
ВнизПомогите решить задачу. Проблема чисто техническая. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.043 c