На рисунке изображен треугольник из чисел. Напишите программу, которая вычисляет наибольшую сумму чисел, расположенных на пути, начинающемся в верхней точке треугольника и заканчивающемся на основании треугольника.
у тебя хоть написано что?
чем тебе помочь-то?
задание случайно не на деревья?
а вот тебе и прога этой задачи:
var ar:array [1..100,1..100] of longint;
i,j,n,m:longint;
f,g:text;
{***********************************************************}
function max(x,y:longint):longint;
begin
if x>y then max:=x
else max:=y;
end;
{***********************************************************}
procedure readdata;
begin
assign(f,'numtri.in'); reset(f);
read(f,n);
for i:=1 to n do
for j:=1 to i do read(f,ar[i,j]);
close(f);
end;
{***********************************************************}
procedure checker;
begin
for i:=2 to n do
for j:=1 to i do
if j=1 then ar[i,j]:=ar[i,j]+ar[i-1,j]
else
if j=i then ar[i,j]:=ar[i,j]+ar[i-1,j-1]
else ar[i,j]:=ar[i,j]+max(ar[i-1,j-1],ar[i-1,j]);
end;
{***********************************************************}
procedure writedata;
begin
assign(g,'numtri.out'); rewrite(g);
for i:=1 to n do
if ar[n,i]>m then m:=ar[n,i];
writeln(g,m);
close(g);
end;
{***********************************************************}
begin
readdata;
checker;
writedata;
end.
Алгоритм абсолютно не верный ...
для матрицы
1
1 1
1 1 1
Результат 11
Это как так ?
Странно... У меня на единичной треугольной матрице из 5 строк выдало 5, на исходном примере - 30... Вроде, все в порядке с алгоритмом (правда, я задавал значения как константы, может с чтением из файла не то что-нибудь?)
Да, проблема в неверном чтении из файла
да нет же мой алгоритм абсолютно верен просто мой ввод из файла таков:
Подскажите, пожалуйста, а можно ли обойтись без чтения из файла, а задать числа прямо в программе? Если да, то как конкретно? Очень надо так решить, помогите!!!
Еще раз прошу, а то мой вопрос затерялся. Помогите, люди добренькие (я заочница).
Подскажите, пожалуйста, а можно ли обойтись без чтения из файла, а задать числа прямо в программе? Если да, то как конкретно? Очень надо так решить, помогите!!!
Можно... Используя одномерный массив вместо двумерного (элементы заносятся сверху вниз, слева направо, например):
Const
vector: array[1 .. 15] of integer = (7, 3, 8, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2, 6, 5);
curr_pos := 1;
for i := 1 to n do
for j := 1 to i do begin
ar[i, j] := vector[curr_pos]; inc(curr_pos);
end;
procedure readdata;
begin
write('введите n>');
readln(n);
for i:=1 to n do
for j:=1 to i do
begin
write('введите ar[',i,',',j,']>');
readln(ar[i,j]);
end;
end;
procedure writedata;
begin
for i:=1 to n do
if ar[n,i]>m then m:=ar[n,i];
writeln('наибольшая сумма равна: ',m);
end;
Спасибо огромное за помощь, программу переделала. Только последняя просьба, можно немного пояснить: что мы этим задаем "write('введите n>');" и "write('введите ar[',i,',',j,']>');" ?
n - это число строк треугольника, например для следующего треугольника:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
n=5
а ar[i,j] - это сами числа, которые составляют треугольник.
Спасибо, с этим я разобралась. Только когда я ввожу цифры (7, 3, 8, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2, 6, 5), то как я понимаю в данном примере наибольшая сумма чисел должна считаться по левой диагонали (7,3,8,2,4) и составит 24, а программа выдает 1345. Может я что-то не так поняла?
Значит, что-то неправильно сделала... Показывай полную программу...
Вот что у меня получилось (на основании как предлагалось выше)
uses crt;
Const
vector: array[1 .. 15] of integer = (7, 3, 8, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2, 6, 5);
var i,j,n,m:longint;
f,g:text;
{***********************************************************}
function max(x,y:longint):longint;
begin
if x>y then max:=x
else max:=y;
end;
{***********************************************************}
procedure readdata;
begin
write('введите n>');
readln(n);
for i:=1 to n do
for j:=1 to i do
begin
write('введите ar[',i,',',j,']>');
readln(vector[i]);
end;
end;
{***********************************************************}
procedure checker;
begin
for i:=2 to n do
for j:=1 to i do
if j=1 then vector[i]:=vector[i]+vector[i-1]
else
if j=i then vector[i]:=vector[i]+vector[i-1]
else vector[i]:=vector[i]+max(vector[i-1],vector[i-1]);
end;
{***********************************************************}
procedure writedata;
begin
for i:=1 to n do
if vector[i]>m then m:=vector[i];
writeln('naibolchay summa',m);
end;
{***********************************************************}
begin clrscr;
readdata;
checker;
writedata;
readkey;
end.
Это где такое предлагалось? Я предлагал совсем другое, и если ты взяла ОДНУ часть от моего предложения, то будь добра взять и ВТОРУЮ, а не комбинировать непонятно что... Вот что я предлагал:
uses crt;(кстати, ответ должен быть не 24, а 30 - я написал об этом еще в посте №7)
Const
n = 5;
vector: array[1 .. 15] of integer =
(7, 3, 8, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2, 6, 5);
var
ar: array [1..100, 1..100] of longint;
m: longint;
{***********************************************************}
function max(x,y:longint):longint;
begin
if x>y then max:=x
else max:=y;
end;
{***********************************************************}
procedure readdata;
var i, j, curr_pos: integer;
begin
curr_pos := 1;
for i := 1 to n do
for j := 1 to i do begin
ar[i, j] := vector[curr_pos]; inc(curr_pos);
end;
end;
{***********************************************************}
procedure checker;
var i, j: integer;
begin
for i:=2 to n do
for j:=1 to i do
if j=1 then ar[i,j]:=ar[i,j]+ar[i-1,j]
else
if j=i then ar[i,j]:=ar[i,j]+ar[i-1,j-1]
else ar[i,j]:=ar[i,j]+max(ar[i-1,j-1],ar[i-1,j]);
end;
{***********************************************************}
procedure writedata;
var i: integer;
begin
for i:=1 to n do
if ar[n,i]>m then m:=ar[n,i];
writeln(m);
end;
{***********************************************************}
begin
clrscr;
readdata;
checker;
writedata;
readkey;
end.
Огромное спасибо!!!
Софа, а ты Ольга??
Нет, я - Ольга, а Софа моя подруга, у нас компьютер с выходом в Интернет один на двоих (и как ты уже догадался мы обе заочницы).
Большое спасибо за помощь. Ольга.