数学&搜索:博弈论之极大极小搜索与alpha-beta减枝
目的是寻找最优的方案使得自己能够利益最大化。
基本思想就是假设自己(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减枝的更多相关文章
- 极大极小搜索思想+(α/β)减枝 【转自-----https://blog.csdn.net/hzk_cpp/article/details/79275772】
极大极小搜索,即minimax搜索算法,专门用来做博弈论的问题的暴力. 多被称为对抗搜索算法. 这个搜索算法的基本思想就是分两层,一层是先手,记为a,还有一层是后手,记为b. 这个搜索是认为这a与b的 ...
- 算法笔记--极大极小搜索及alpha-beta剪枝
参考1:https://www.zhihu.com/question/27221568 参考2:https://blog.csdn.net/hzk_cpp/article/details/792757 ...
- POJ 1568 极大极小搜索 + alpha-beta剪枝
极小极大搜索 的个人理解(alpha-beta剪枝) 主要算法依据就是根据极大极小搜索实现的. 苦逼的是,查了两个晚上的错,原来最终是判断函数写错了..瞬间吐血! ps. 据说加一句 if sum & ...
- poj 1568 Find the Winning Move 极大极小搜索
思路:用极大极小搜索解决这样的问题很方便!! 代码如下: #include <cstdio> #include <algorithm> #define inf 10000000 ...
- [CodeVs3196]黄金宝藏(DP/极大极小搜索)
题目大意:给出n(≤500)个数,两个人轮流取数,每次可以从数列左边或者右边取一个数,直到所有的数被取完,两个人都以最优策略取数,求最后两人所得分数. 显然这种类型的博弈题,第一眼就是极大极小搜索+记 ...
- [转载]SharePoint 2013搜索学习笔记之搜索构架简单概述
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- 点击搜索取消UISearchDisplayController的搜索状态
一般,我们用到UISearchDisplayController的时候,都是须要对一个数据源进行刷选,在UISearchDisplayController自带的tableView中展示出来,然后点击退 ...
- lucene全文搜索之四:创建索引搜索器、6种文档搜索器实现以及搜索结果分析(结合IKAnalyzer分词器的搜索器)基于lucene5.5.3
前言: 前面几章已经很详细的讲解了如何创建索引器对索引进行增删查(没有更新操作).如何管理索引目录以及如何使用分词器,上一章讲解了如何生成索引字段和创建索引文档,并把创建的索引文档保存到索引目录,到这 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
随机推荐
- JS扫雷原理性代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 分享:50行代码监听watch小程序的globalData
监听方法: // 在任何组件.页面,例如页面 const app = getApp( ); Page({ onLoad: function( ) { app.watch$('role', ( val, ...
- IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况
IE8 没有内容的盒子,如果有定位,浮现在其他盒子上 可能会有点击穿透没有作用的情况
- luogu 1360 阵容均衡(前缀和+差分+hash)
要求一段最大的区间里每个能力的增长值是一样的. 我们首先求一遍前缀和,发现,如果区间内[l,r]每个能力的增长值是一样的话,那么前缀和[r]和[l-1]的差分也应该是一样的. 那么我们把前缀和的差分h ...
- 转:解决Python中文编码问题
Python 文本挖掘:解决Python中文编码问题 转于:http://rzcoding.blog.163.com/blog/static/2222810172013101785738166/ ...
- 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名
Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...
- ZendFramework安装配置
1.创建项目目录 E:/wwwroot/myzfpro 运行cmd后,cd到框架源文件的bin目录 运行zf.bat创建命令:zf.bat create project E:/wwwroot/myzf ...
- CDN公共库、前端开发常用插件一览表(VendorPluginLib)
=======================================================================================前端CDN公共库===== ...
- 64位win10系统无法安装.Net framework3.5的两种解决方法【转】
近日有网友反映在windows10_64位系统电脑上安装Net framework3.5,操作时总失败,怎么办呢?小编下面就介绍win10 64位系统无法安装Net framework3.5的两种解决 ...
- Java配置jdk图文教程
1.计算机 ==>右键属性 2.高级系统设置 3.环境变量 4.找path变量 5.找到jdk的bin目录并复制路径到path环境变量里(jdk5.0以后就可以只配path路径了). 6.pat ...