Треугольник
http://acm.pku.edu.cn/JudgeOnline/problem?id=1163
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Треугольник из чисел
На рисунке выше изображен треугольник из чисел. Напишите программу, которая вычисляет наибольшую сумму чисел, расположенных на пути, начинающемся в верхней точке и заканчивающемся на основании треугольника.
Каждый шаг на пути может осуществляться вниз по диагонали влево, или вниз по диагонали вправо.
Входные данные
Первым числом входных данных является количество строк в треугольнике. Далее следует соответствующее число строк с описанием самого треугольника. Число строк в треугольнике больше 1 и меньше или равно 100. Треугольник составлен из целых чисел от 0 до 99.
Выходные данные
Выведите единственное число - искомую наибольшую сумму.
Пример входных данных
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Пример выходных данных
30
Анализ условия и обсуждение идеи решения
Задача является "утешительной". Это типичная задача на метод динамического программирования. Рекомендуется для приведенного примера найти путь вручную и после этого составить соответствующую программу ученикам самостоятельно на основании найденных рекуррентных отношений для созданной динамической таблицы.
Пример решения на Pascal:
var n, i, j: longint;
a, f: array[1 .. 101, 1 .. 101] of longint;
begin
readln(n);
for i := 1 to n do for j := 1 to i do read(a[i, j]);
fillchar(f, sizeof(f), 0);
for i := n downto 1 do
for j := 1 to i do
if f[i + 1, j] > f[i + 1, j + 1] then f[i, j] := f[i + 1, j] + a[i, j]
else f[i, j] := f[i + 1, j + 1] + a[i, j];
writeln(f[1, 1]);
end.Пример решения на С++:
#include<stdio.h>
int main()
{
int i, j, a[101][101], n;
while( scanf( "%d", &n ) != EOF )
{
for( i = 0; i < n; i++ )
for( j = 0; j <= i; j++ )
scanf( "%d", &a[i][j] );
for( i = n - 1; i >= 0; i-- )
{
for( j = 0; j < i; j++ )
{
if( a[i][j] > a[i][j + 1] )
a[i - 1][j] += a[i][j];
else
a[i - 1][j] += a[i][j + 1];
}
}
printf( "%d\n", a[0][0] );
}
return 0;
}