目的是寻找最优的方案使得自己能够利益最大化。

基本思想就是假设自己(A)足够聪明,总是能选择最有利于自己的方案,而对手(B)同样足够聪明,总会选择最不利A的方案

对抗搜索就是对于先手来说,取后手中状态最大的;对于后手来说,取终态中状态最小的

对于第一个人

它一定从当前局面可以到达的所有局面中,选择一个最大的走

第二个人一定会从当前局面所有可以到达的局面中,选择一个最小的走

省选第一题一双木棋

正解是博弈论记忆化搜索+状态压缩

然而我这里先贴一份纯对抗搜索的代码

 #include <cstdio>
#include <algorithm>
#include <cstring>
bool vis[][];
int a[][],b[][];
int col[][];
int n,m;
struct node{
int ans1,ans2;
};
node dfs(int num,int f)
{
if(num==n*m)
{
int ans1=,ans2=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(col[i][j]==) ans1+=a[i][j];
if(col[i][j]==) ans2+=b[i][j];
}
return (node){ans1,ans2};
}
node ans;
int maxi=-1e9+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
if(vis[i-][j]||(i-==))
if(vis[i][j-]||(j-==))
if(!vis[i][j])
{
vis[i][j]=;
col[i][j]=f;
node dx=dfs(num+,f==?:);
vis[i][j]=;
col[i][j]=;
int ansx=f==?dx.ans1-dx.ans2:dx.ans2-dx.ans1;
if(ansx>maxi) maxi=ansx,ans=dx;
}
}
return ans;
}
int main()
{
//freopen("chess.in","r",stdin);
//freopen("chess.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&b[i][j]);
node ans=dfs(,);
printf("%d\n",ans.ans1-ans.ans2);
return ;
}

然后是状态压缩+记忆化

 #include <cstdio>
#include <algorithm>
#include <map>
#define ll long long
#define inf 0x7fffffff
std::map <ll,int> mp;
ll end;
int n,m;
int num[],a[][],b[][];
inline int unzip(ll sta)
{
int s=;
for(int i=n;i;i--) s+=(num[i]=(sta%(m+))),sta/=(m+);
return s&;
}
inline ll zip()
{
ll s=;
for(int i=;i<=n;i++) s=s*(m+)+num[i];
return s;
}
int DFS(ll sta)
{
if(mp.find(sta)!=mp.end()) return mp[sta];
if(sta==end) return ;
int opt=unzip(sta);
int ans=opt?inf:-inf;
if(num[]<m)
{
++num[];
if(opt) ans=std::min(ans,DFS(zip())-b[][num[]]);
else ans=std::max(ans,DFS(zip())+a[][num[]]);
--num[];
}
for(int i=;i<=n;i++)
if(num[i-]>num[i])
{
++num[i];
if(opt) ans=std::min(ans,DFS(zip())-b[i][num[i]]);
else ans=std::max(ans,DFS(zip())+a[i][num[i]]);
--num[i];
}
return mp[sta]=ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&b[i][j]);
for(int i=;i<=n;i++) num[i]=m;
end=zip();
DFS();
printf("%d\n",mp[]);
return ;
}

数学&搜索:博弈论之极大极小搜索与alpha-beta减枝的更多相关文章

  1. 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】

    极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...

  2. 算法笔记--极大极小搜索及alpha-beta剪枝

    参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...

  3. POJ 1568 极大极小搜索 + alpha-beta剪枝

    极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...

  4. poj 1568 Find the Winning Move 极大极小搜索

    思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...

  5. [CodeVs3196]黄金宝藏(DP/极大极小搜索)

    题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...

  6. [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述

    Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...

  7. 点击搜索取消UISearchDisplayController的搜索状态

    一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退 ...

  8. lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3

    前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...

  9. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

随机推荐

  1. 团队作业——王者光耀:team

    光耀101  <光耀101>是福州大学数计学院计算机专业推出的中国首部程序猿脱发养成节目.由张栋担任发起人,刘晨瑶.畅畅担任导师.  该节目召集了你猜多少位选手,通过任务.训练.考核,让选 ...

  2. sql主表分页查询关联子表取任意一条高效方案

    有个业务场景,主表中一条数据,在子表中有多条详情数据.对数据进行展示的时候,产品希望随意拿一条子表的数据关联展示出来,用了很多方案,但是都不够好. sql查询取子表任意一条,多个字段的方案 最终找到一 ...

  3. lintcode-480-二叉树的所有路径

    480-二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 您在真实的面试中是否遇到过这个题? Yes 样例 给出下面这棵二叉树: 所有根到叶子的路径为: [ "1-> ...

  4. lintcode-65-两个排序数组的中位数

    65-两个排序数组的中位数 两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n)). 样例 给出数组A = [1,2,3,4,5,6] B = [ ...

  5. 对IT行业的一些思考

          阅读完两篇报道,从“2014年十大最热门行业和职业排行榜”可以看出最热门的行业是IT行业,可以看出IT行业在未来的发展前景很乐观,选择IT行业的人也会越来越多,IT行业也会越来越庞大.但是 ...

  6. Spring 中常用注解原理剖析

    前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...

  7. Vue父组件与子组件传递事件/调用事件

    1.Vue父组件向子组件传递事件/调用事件 <div id="app"> <hello list="list" ref="child ...

  8. 【Asp.Net Core】在Visual Studio 2017中使用Asp.Net Core构建Angular4应用程序

    前言 Visual Studio 2017已经发布了很久了.做为集成了Asp.Net Core 1.1的地表最强IDE工具,越来越受.NET系的开发人员追捧. 随着Google Angular4的发布 ...

  9. Spark:一个高效的分布式计算系统--转

    原文地址:http://soft.chinabyte.com/database/431/12914931.shtml 概述 什么是Spark ◆ Spark是UC Berkeley AMP lab所开 ...

  10. NOIP2015运输计划题解报告

    这题在洛谷上可以找到提交 P2680运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航 ...