假设我们正在玩猜猜游戏。游戏的规则如下-
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