Чтобы добраться до финиша, вы должны сначала приземлиться на
finish - 5
или finish - 3
или finish - 2
, а затем оттуда еще 1 нажатие кнопки, чтобы достичь finish
.
Рекурсивная формула для этого:
minSteps(end) = 1 + Math.min( minSteps(end-5), Math.min(minSteps(end-2), minSteps(end-3)) )
Вы можете закодировать это как в (Java) с памяткой:
private static int minSteps( int start, int end, String s ) {
if ( end < start ) return Integer.MAX_VALUE;
if ( end == start ) return 0;
if ( s.charAt(end) == 'r' ) {
dp[end] = Integer.MAX_VALUE;
return dp[end];
}
if ( dp[end] != -1 ) return dp[end];
int stepTwo = minSteps( start, end - 2, s );
int stepThree = minSteps( start, end - 3, s);
int stepFive = minSteps( start, end - 5, s );
int min = Math.min( Math.min( stepTwo, stepThree ), stepFive );
if ( min != Integer.MAX_VALUE ) {
dp[end] = 1 + min;
} else {
dp[end] = min;
}
return dp[end];
}
Для ввода: w w w w w w r r w w w w r w r w r w
результирующий массив dp
будет:
[-1, 2147483647, 1, 1, 2, 1, 2147483647, 2147483647, 2, 3, 2, 3, 2147483647, 3, 2147483647, 3, -1, 4]
и ответ 4: 18 -> 16 -> 11 -> 6 -> 1
тогда вы можете строить свои прыжки с конца, следуя массиву dp
.