您的位置:首页 > 产品设计 > UI/UE

Guess Number Higher or Lower II

2016-09-02 14:35 459 查看
看了半天还是似懂非懂,o(╯□╰)o

用了极小极大算法:在1-n个数里面,我们任意猜一个数(设为i),保证获胜所花的钱应该为 i + max(w(1 ,i-1), w(i+1 ,n)),这里w(x,y))表示猜范围在(x,y)的数保证能赢应花的钱,则我们依次遍历 1-n作为猜的数,求出其中的最小值即为答案

class Solution {
public:
int getMoneyAmount(int n) {
vector<vector<int> > table(n+1,vector<int>(n+1,0));
int res = DP(table, 1, n);
return res;
}

int DP(vector<vector<int> > &t, int s, int e) {
if (s >= e) return 0;
if (t[s][e] != 0) return t[s][e];
int res = INT_MAX;
for (int k = s; k <= e; k++) {
int tmp = k + max(DP(t, s, k - 1), DP(t, k + 1, e));//极大部分
res = min(res, tmp);//极小部分,合起来就是极小极大算法
}
t[s][e] = res;//这个配合上面的if条件做剪枝用,其实这个迭代过程生成了一颗特别大的博弈树,dp数组只是记载了一些迭代路径
return res;
}
};
用n=3迭代着在纸上写了写,明白了不少
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: