Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.049 c
3-1135253805
UnDISCOvery
2005-12-22 15:16
2006.02.19
MS Access - поле типа "счетчик"


2-1138201425
pegucka
2006-01-25 18:03
2006.02.19
Окончание работы DLL


15-1138429327
Карелин Артем
2006-01-28 09:22
2006.02.19
Сила алкоголя...


2-1138739534
MIXER
2006-01-31 23:32
2006.02.19
строки ---Edit


1-1137591191
kyn66
2006-01-18 16:33
2006.02.19
Сложный запрос по таблице





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский