在C ++中猜测数字的高低II
假设我们正在玩猜猜游戏。游戏的规则如下-
Player1选择一个从1到n的数字。玩家2必须猜测玩家1选择了哪个号码。
每当玩家2猜错时,玩家1都会告诉您所选择的数字是更高还是更低。
但是,当一个玩家猜出一个特定的数字x时,另一个玩家猜错了,另一个玩家必须支付$ x。当player2得到正确答案后,游戏将结束。
例如,如果n = 10,而玩家1拿了8
在第一轮中,player2告诉数字是5,那是错误的,实际数字更高,那么他会给$ 5
在第二轮中,player2告诉数字是7,那是错误的,实际数字更高,那么他会给$ 7
在第三轮中,player2告诉数字为9,那是错误的,实际数字较低,那么他会给$ 9
现在游戏结束。因此,给定的总金额为$ 5 + $ 7 + $ 9 = $ 21。
为了解决这个问题,我们将遵循以下步骤-
创建一个称为成本的方法,即低,高,另一种表dp
如果低> =高,则返回0
如果dp [low,high]不为-1,则返回dp [low,high]
ans:= inf
对于我范围从低到高
ans:= ans的最小值和(i +最大成本(low,i – 1,dp)和cost(i + 1,高,dp))
dp [low,high]:= ans并返回ans
实际的方法将是-
制作一个称为dp的2d数组,其大小为(n + 1)x(n + 1),并用-1填充
返回成本(1,n,dp)
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h>using namespace std;
class Solution {
public:
int cost(int low, int high, vector < vector <int> >& dp){
if(low >= high)return 0;
if(dp[low][high] != -1)return dp[low][high];
int ans = INT_MAX;
for(int i = low; i <= high; i++){
ans = min(ans, i + max(cost(low, i - 1, dp), cost(i + 1, high, dp)));
}
return dp[low][high] = ans;
}
int getMoneyAmount(int n) {
vector < vector <int> > dp(n + 1, vector <int> (n + 1, -1));
return cost(1, n, dp);
}
};
int main() {
Solution ob1;
cout << ob1.getMoneyAmount(8) << endl;
return 0;
}
输入值
8
输出结果
12
以上是 在C ++中猜测数字的高低II 的全部内容, 来源链接: utcz.com/z/327014.html