Мне нужна помощь с проблемой. Я недавно получил это в интервью, и я пытался решить это, но безуспешно. Вот вопрос:
Код алгоритма для игры, состоящей из двух игроков. На входе положительное целое число х. Каждый раунд игрок вычитает идеальный квадрат из числа. Игрок может выбрать любой идеальный квадрат, если он меньше или равен текущему числу и больше 0. Текущий игрок выигрывает, если число становится 0 после его удержания.
Я полагаю, что это должно быть сделано с использованием динамического программирования / жадного подхода, с которым я не очень хорошо разбираюсь. Или нам может понадобиться создать последовательность выигрышных / проигрышных чисел, и если игрок окажется в выигрышной последовательности, он выиграет несмотря ни на что. Но как мы можем придумать такую последовательность?
Может кто-нибудь помочь мне решить этот вопрос, возможно, на Java?
UPDATE:
Решение 1, предложенное DAle:
public int subtractPerfectSquares(int n)
{
if (n <= 0)
return 1;
boolean[] isWinningCase = new boolean[n + 1];
for (int i = 1; i <= n; i++)
{
for (int num = 1; num * num <= i; num++)
{
if (!isWinningCase[i - (num * num)])
{
isWinningCase[i] = true;
break;
}
}
}
return isWinningCase[n] ? 1 : 2;
}
Решение2 изменено для лучшего понимания:
public int subtractPerfectSquares2(int n)
{
if (n <= 0)
return 1;
boolean[] isWinningCase = new boolean[n + 1];
// if we reach 0, we win
isWinningCase[0] = true;
// 1 is a win
isWinningCase[1] = true;
// 2 is a losing condition. We must define this as this state dictates losing scenarios for further states
isWinningCase[2] = false;
// we start from 3
for (int i = 3; i <= n; i++)
{
for (int num = 1; num * num <= i; num++)
{
int prefectSquare = num * num;
// if we get to 0 from current number or if we get to a losing scenario (to be faced by next player) from current number, then the current state is a winning position
if (i - prefectSquare == 0 || !isWinningCase[i - prefectSquare])
{
isWinningCase[i] = true;
break;
}
}
}
// return player 1 if given number is a winning state else player 2 wins
return isWinningCase[n] ? 1 : 2;
}