Как составить алгоритм решения задачи на ДП или Рекурсию (Задача на лесенку)?
Решить задачу легко - заводите массив A[N,N], в каждой клетке [K,M] которого будет записано число лесенок из K кубиков, нижний слой которых состоит из M кубиков. Число будет ненулевым, когда M <= K <= M*(M+1)/2. 
Массив заполняется начиная со строчки K=1 по формуле A[K,M]=sum(A[K-M,r],r=1..M-1). Сумма элементов в строчке K=N будет искомым числом.
В решении, ссылку на которое вы дали, последовательно вычисляется число лестниц из j кубиков, нижний ряд которых не длиннее, чем i кубиков. Чтобы найти это число, надо к уже найденным лестницам, нижний ряд которых не длиннее, чем i-1 кубик (их мы оставляем без изменения), прибавить лестницы из j-i кубиков с нижним рядом не длиннее, чем i-1 кубик (к ним мы добавим ряд из i кубиков). Что и делается во внутреннем цикле.
Могу ошибаться, но задача решается ещё проще. main(x) {
    result = 1;
    for(i = 1; i < x/2; i++) {
        result += main(i);  // при x = 7, i = 1, 2, 3
    }
    return (x < 1) ? 0 : result;
}
Немного пояснения. 
Число 7 можно разложить так: 0000000

0
000000

00
00000

000
0000
Остальное нам не нужно. 
Вспомните как считается факториал. f (x) {
  return (!x) ? 1 : x * f(x - 1);
}
В итоге мы раскладываем верхний ряд на ещё более мелкие и суммируем результаты. 
Результат для двойки равен результату от единицы,
для тройки результат единицы. (целое от 3/2),
для четверки результат единицы и результат двойки и так далее... 
P.S.
Задачка интересная. Одно из решений описал Mrrl 
В своём решении не уверен на 100%, но вроде работает :)