Треугольник
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;
}