问题:继[374]Guess Number Higher or Lower,升级版1~n之间猜数游戏。猜错即付猜的数字的钱,要求最小化玩家最大损失。
输入:n
输出:最大损失
主要思想:动态规划
举例n=3时,猜2即可最小化最大面临的损失。
定义dp(i,j)为(i,j)区间内最坏情况下猜中数的最小开销(保证能赢得游戏)。
class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int>> res(n+1,vector<int> (n+1));
for(int len=2;len<=n;++len)
{
for(int start=1;start<=n-len+1;++start)
{
int minres=INT_MAX;
for(int pick=start;pick<start+len-1;++pick)
{
int r=pick+max(res[start][pick-1],res[pick+1][start+len-1]);
minres=min(r,minres);
}
res[start][start+len-1]=minres;
}
}
return res[1][n];
}
};
复杂度分析:时间复杂度为O(n^3),空间复杂度为O(n^2).