金盒问题(方法)
有'n'个金盒子连续放置,每个金盒子都有不同数量的金币。 2名玩家玩游戏,其动机是收集最大数量的金币。每个玩家可以看到每个盒子中有多少硬币,但是轮到他们只能从两端获得一个盒子。 设计一个让Player1获胜的策略(假设两个玩家都玩得很聪明)
亚马逊的采访中提到了这个问题。我试过这种方法:
#include<stdio.h>
int max(int a, int b) {
return a>b?a:b;
}
int maxCoins(int arr[], int i, int j, int turn) {
if(i==j) {
if(turn == 1) return arr[i];
else return 0;
}
if(turn) {
return max(arr[i] + maxCoins(arr,i+1,j,0),arr[j] + maxCoins(arr,i,j-1,0));
} else {
if(arr[i]>arr[j])
return maxCoins(arr,i+1,j,1);
else
return maxCoins(arr,i,j-1,1);
}
}
int main() {
int arr[10] = {6,7,4,1,10,5,4,9,20,8}; //{2,3,4,5,6,7,8,9,10,11};
printf("%d\n",maxCoins(arr,0,9,1));
}
但我认为这是不对的,因为玩家2也玩得很聪明。请帮助我缺少的东西。
答案 0 :(得分:0)
我得到了解决方案,接近了。这是我错过的:
&#34;对手打算选择给用户留下最小价值的硬币。&#34;
这是更新的解决方案:
#include<stdio.h>
int max(int a, int b) {
return a>b?a:b;
}
int min(int a, int b) {
return a<b?a:b;
}
int maxCoins(int arr[], int i, int j, int turn) {
int a,b;
if(i==j) {
if(turn == 1) return arr[i];
else return 0;
}
if(turn) {
a = arr[i] +maxCoins(arr,i+1,j,0);
b = arr[j] + maxCoins(arr,i,j-1,0);
return max(a,b);
} else {
return min(maxCoins(arr,i+1,j,1), maxCoins(arr,i,j-1,1));
}
}
int main() {
int arr[4] = {8, 15, 3, 7 };//{6,7,4,1,10,5,4,9,20,8}; //{2,3,4,5,6,7,8,9,10,11};
printf("%d\n",maxCoins(arr,0,3,1));
}
此链接讨论策略: http://www.geeksforgeeks.org/dynamic-programming-set-31-optimal-strategy-for-a-game/