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

基本思想就是假设自己(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. PyCharm如何设置源代码字体的大小

    改源代码大小 1.File→Settings→Editor→Colors&Fonts→Font 2.首先得需要Save as一个Scheme,接下来才可以修改字体,名字可以任意取 改运行字体的 ...

  2. 软工1816 · Alpha冲刺(6/10)

    团队信息 队名:爸爸饿了 组长博客:here 作业博客:here 组员情况 组员1(组长):王彬 过去两天完成了哪些任务 alpha冲刺时间延后一周,重新规划任务安排 完成食堂店铺经纬度标注,以供美食 ...

  3. android入门 — Activity生命周期

    Activity总共有7个回调方法,代表着不同的生命周期的环节. 1.onCreate() 在活动第一次被创建的时候调用.在这个方法中需要完成活动的初始化操作,比如说加载布局.绑定事件等. 2.onS ...

  4. 使用 virt-install 创建虚拟机

    使用 virt-install 创建虚拟机 virt-install --help 使用 qemu-kvm 创建虚拟机 介绍 1:命令路径:/usr/libexec/qemu-kvm   2:添加至环 ...

  5. 爬虫学习之-操作mysql

    在操作数据库的时候,python2中一般使用mysqldb,但在python3中已经不在支持mysqldb了,我们可以用pymysql和mysql.connector.本文的所有操作都是在python ...

  6. 分享几个IP获取地理位置的API接口(最全面的了)

    转载;https://cloud.tencent.com/developer/article/1152362 全网首发,最全的IP接口,不服来辩!博主找了几个小时的资料,又手动抓取到了几个接口补充进来 ...

  7. TClientDataSet[5]: 读取数据

    本例用到: TClientDataSet.Fields[];          { 字段集合; 它比 FieldList 有更多功能, 如可获取嵌套字段 } TClientDataSet.FieldL ...

  8. 学习websocket-SignalR,MVC中使用SignalR打造酷炫实用的即时通讯

    http://www.cnblogs.com/Leo_wl/p/4793284.html http://www.fangsi.net/archives/1144.html

  9. SQL入门之集合操作

    尽管可以在与数据库交互时一次只处理一行数据,但实际上关系数据库通常处理的都是数据的集合.在数学上常用的集合操作为:并(union),交(intersect),差(except).对于集合运算必须满足下 ...

  10. 基本数据类型用 == 判断的是值 ,对象用 == 判断的是地址 , 判断值的话用 equals()

    基本数据类型用 == 判断的是值   ,对象用 == 判断的是地址 ,  判断值的话用 equals() 字符串是String的实例