Хорошо, вот что делает код.
`if (n<0)`
`return 0;`
Если осталось недостаточно шагов, то не считайте их. Например, если осталось два шага, но пользователь пытается сделать три шага, то это не считается возможной комбинацией.
else if (n==0)
return 1;
Если количество оставшихся шагов совпадает с количеством доступных шагов, которые пытается выполнить пользователь, это возможная комбинация. Итак, верните 1, потому что это возможная комбинация, и ее следует добавить к общему количеству допустимых комбинаций.
else if (map[n]>-1)
return map[n];
Вот часть динамического программирования. Предположим, что все значения в массиве имеют значение -1. Итак, если число больше -1, оно уже решено, поэтому верните общее количество комбинаций из шага номер n вместо его разрешения.
`map[n] = countDP(n-1, map) + countDP(n-2, map) + countDP(n-3, map);`
return map[n]; }
Наконец, эта часть решает код. Количество возможных комбинаций равно количеству возможных комбинаций, которые пользователь может получить, если сделает 1 шаг + количество возможных комбинаций, которые пользователь может получить, если он сделает 2 шага + количество возможных комбинаций, которые пользователь может получить, если он сделает три шага.
Например, предположим, что есть 5 шагов
Простой запуск будет выглядеть так:
//The number of solutions from the fifth step
countDp(5) = countDp(4)+countDp(3)+countDp(2);
//Number of solutions from the fourth step
countDP(4) = countDp(3)+countDp(2)+countDp(1);
//Number of solutions from the third step
countDp(3) = countDp(2)+countDp(1)+countDp(0);
//Number of solutions from the second step
countDp(2) = countDp(1)+countDp(0)+countDp(-1);
//Number of solutions from the first step
countDp(1) = countDp(0) + countDp(-1)+countDp(-2);
//Finally, base case
countDp(0) = 1;
countDp(-1)= 0;
countDp(-2)= 0;
countDp(1) = 1+0+0 = 1;
countDp(2) = 1+1+0 = 2; //Dynamic programming: did not have to resolve for countDp(1), instead looked up the value in map[1]
countDp(3) = 2+1+1 = 4; //Dynamic programming, did not have to solve for countDp(1), countDp(2), instead looked up value in map[1] and map[2]
countDp(4) = 4+2+1=7 //Dynamic programming, did not have to solve for CountDp(3),CountDp(2), CountDp(1), just looked them up in map[3],map[2],map[1]
countDp(5)= 2+4+7=13 //Dynamic programming, just used map[4]+map[3]+map[2]
22.07.2013