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

基本思想就是假设自己(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. 第八次作业(课堂实战)- 项目UML设计

    本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...

  2. 类的static成员变量和成员函数能被继承吗

    1.   父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点 ...

  3. purcell的emacs配置中的自动补全功能开启

    标记一下,原文参看purcell的emacs配置中的自动补全功能开启 修改init-auto-complete.el文件 ;;(setq-default ac-expand-on-auto-compl ...

  4. 第四周PSP &进度条

    团队项目PSP 一:表格     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论开发环境.工具以及技术 8:37 10:42 25 10 ...

  5. git因commit的记录太大导致push失败解决方法

    发现好像这个方法不好使.......~~!还是会失败 如果有人或者自己失误把不该同步的大文件如数据或日志或其他中间文件给commit了并且push了,然后你删掉了,但是其实他仍然在你的git记录中,你 ...

  6. web.py 中文模版报错

    1. 作为模板的html文件,必须是utf-8编码; 2. html文件内容中的charset必须为utf-8,也就是必须包含 <meta http-equiv="Content-Ty ...

  7. PHP伪类型和伪变量

    一.伪类型 PHP伪类型有三种,分别是:1,mixed混合类型.2,number数字类型.3,callback回调类型. 1,mixed混合类型: mixed说明一个参数可以接受多种不同的类型,但并不 ...

  8. 【linux使用】bash shell命令行常用快捷键

    移动: Ctrl + A: 移动到当前编辑的命令行首, Ctrl + E: 移动到当前编辑的命令行尾, Ctrl + F 或 ->:按字符右移(往命令行尾部方向,前移) Ctrl + B 或 & ...

  9. 第145天:jQuery.touchSlider触屏满屏左右滚动幻灯片

    1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. Web模块:spring-boot-starter-web

    spring-boot-autoconfigure-1.5.1.RELEASE.jar!/org/springframework/boot/autoconfigure/web 上述jar的web包下, ...