Мне задали в интервью следующий вопрос.
Учитывая ряд домов, в которых есть энергия и монеты, связанные с каждым из них. Какое максимальное количество монет может быть собрано без энергии, становящейся отрицательной. Энергия для перемещения из одного дома в другой равна 1, дома не могут быть пропущены.
Например, например, EnergyArray = {1, 5, 3, 3, 1} и CoinsArray = {3, 23, 9, 2, 2}, и начальная энергия дана как 1, тогда выходной сигнал должен быть 32, причина возьмите 1 энергию из дома 1, добавьте к ней текущую энергию, так что полная энергия = 2 и отправьтесь во 2-й дом (энергия-1 = 1), возьмите монеты, чтобы монеты = 23, перейдите к следующему дому (энергия-1 = 0), возьмите монеты, так что всего 32.
Аналогично для energyArray = {2, 1, 1} и coinsArray = {11, 5, 7} и начальной энергии = 0, вывод должен быть 12.
Программа, которую я написал это как
public class HouseEnergyCoin {
/*static int[] energyA = {1,5,3,3,1};
static int[] coins = {3,23,9,2,2};
static int initialEnergy = 1;*/
static int[] energyA = {2,1,1};
static int[] coins = {11,5,7};
static int initialEnergy = 0;
public static void main(String[] args) {
int energySum = initialEnergy;
for (int i=0; i< energyA.length;i++){
energySum+=energyA[i];
}
int[][] mem = new int[coins.length+1][energySum];
System.out.println(maxCoins(initialEnergy, 1, mem));
}
static int maxCoins(int energy, int index, int[][] mem) {
if (energy < 0 || index > coins.length) {
return 0;
}
if (mem[index][energy] != 0){
return mem[index][energy];
}
else {
int result = max(maxCoins(energy+energyA[index-1]-1,index+1, mem),
coins[index-1]+maxCoins(energy-1, index+1, mem));
mem[index][energy] = result;
return result;
}
}
static int max(int a, int b) { return (a > b)? a : b; }
}
, который работает для некоторых сценариев ios, а для других это время ожидания, может кто-нибудь, пожалуйста, помогите мне с лучшим решением?