#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<stack>
#include<set>
#include<unordered_set>
#include<algorithm>
/* 范围上的尝试模型 特点 范围上的尝试模型由于left必定right 所以dp表只有斜对线一半(包括斜对线位置)有效 */
/*案列一 :二分查找arr最小值 ******/
//返回left right 内部的最小值
int binary_findmin(vector<int>arr, int left, int right) {
if (left == right) return arr[left];
int mid = (left + right) / 2;
int leftmin = binary_findmin(arr, left, mid);
int rightmin = binary_findmin(arr, mid+1, right);
return min(leftmin, rightmin);
}
/*案例二 : */
/* 给定一个数组card 代表一排分数,A和B依次拿去每张card,但只能拿去左边或者右边
的分数,A先B后,A与B都绝顶聪明,返回A所能获得分数和B能获得的分数
*/
/********************************暴力递归***********************************/
class Solution {
public://返回先手选择(包括left以后)能够获得的最大分数
int firstchoose(vector<int>card, int left, int right) {
if (left == right) return card[left];
//返回max( 选择left+后手在left+1 ,right范围的最大分数 , 选择right+后手在left ,right-1范围的最大分数 )
return max(card[left] + lastchoose(card, left + 1, right), card[right] + lastchoose(card, left, right - 1));
}
//返回 后手选择能够获得的最大分数 (包括left以后)决策不由当事人决定
int lastchoose(vector<int>card, int left, int right) {
if (left == right) return 0;
//为什么是min? 因为该决策过程是由对手做出的 当事人没有选择权
return min(firstchoose(card, left + 1, right), firstchoose(card, left, right - 1));
}
};
/********************************暴力递归***********************************/
![在这里插入图片描述](https://img-blog.csdnimg.cn/2021041623143620.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNjA2MTQ1,size_16
范围上的尝试模型
最新推荐文章于 2022-04-05 13:26:13 发布