poj 1085 Triangle War 博弈论+记忆化搜索
思路:总共有18条边,9个三角形。
极大极小化搜索+剪枝比较慢,所以用记忆化搜索!!
用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解。
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define inf 1<<25
using namespace std;
int edge[][]={{,},{,},{,},{,},{,},{,},{,},{,},{,},{,},{,},{,},{,},{,},{,}
,{,},{,},{,}};
int tri[][]={{,,},{,,},{,,},{,,},{,,},{,,},{,,},{,,},{,,}};
int p[],dp[<<];
int cal(int state,int e)
{
int ans=;
for(int i=;i<;i++){
bool flag=;
for(int j=;j<;j++) //判断边e是否在这个三角形中
if(e==tri[i][j]) flag=true;
if(flag){ //e在这个三角形中
for(int j=;j<;j++){
if(!(p[tri[i][j]]&state||e==tri[i][j])){ //如果满足条件说明tri[i][j]这条边不存在且e也不是这条边
ans--;break; //也就是不能构成三角形,否则能构成
}
}
ans++;
}
}
return ans;
}
int dfs(int state)
{
if(dp[state]!=-inf) return dp[state];
int ans=-inf;
for(int i=;i<;i++){
if(!(state&p[i])){
int tt=cal(state,i);
if(tt) tt+=dfs(state|p[i]);
else tt-=dfs(state|p[i]);
ans=max(ans,tt);
}
}
return dp[state]=ans;
}
int main()
{
//freopen("1.txt","r",stdin);
int t,u,v,ca=,m;
p[]=;
for(int i=;i<;i++) p[i]=p[i-]*;
for(int i=;i<(<<);i++) dp[i]=-inf;
dp[(<<)-]=;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
int m0=,m1=,tt=,state=,side=;
while(m--){
scanf("%d%d",&u,&v);
for(int i=;i<;i++)
if(edge[i][]==u&&edge[i][]==v){
tt=cal(state,i);
state|=p[i];
side==?m0+=tt:m1+=tt;
side++;
if(tt) side++;
side%=;
break;
}
}
int ans=m0-m1;
if(side==) ans+=dfs(state);
else ans-=dfs(state);
printf("Game %d: %s\n",++ca,ans>?"A wins.":"B wins.");
}
return ;
}
poj 1085 Triangle War 博弈论+记忆化搜索的更多相关文章
- poj 1085 Triangle War (状压+记忆化搜索)
Triangle War Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2685 Accepted: 1061 Desc ...
- poj 3249(bfs+dp或者记忆化搜索)
题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...
- poj 1661 Help Jimmy(记忆化搜索)
题目链接:http://poj.org/problem?id=1661 一道还可以的记忆化搜索题,主要是要想到如何设dp,记忆化搜索是避免递归过程中的重复求值,所以要得到dp必须知道如何递归 由于这是 ...
- poj1163The Triangle(动态规划,记忆化搜索)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...
- hdu 4753 Fishhead’s Little Game 博弈论+记忆化搜索
思路:状态最多有2^12,采用记忆化搜索!! 代码如下: #include<iostream> #include<stdio.h> #include<algorithm& ...
- poj 1088 动态规划+dfs(记忆化搜索)
滑雪 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Description Mi ...
- poj 1579(动态规划初探之记忆化搜索)
Function Run Fun Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 17843 Accepted: 9112 ...
- POJ 3616 Milking Time ——(记忆化搜索)
第一眼看是线段交集问题,感觉不会= =.然后发现n是1000,那好像可以n^2建图再做.一想到这里,突然醒悟,直接记忆化搜索就好了啊..太蠢了.. 代码如下: #include <stdio.h ...
- POJ 1661 Help Jimmy ——(记忆化搜索)
典型的记忆化搜索问题,dfs一遍即可.但是不知道WA在哪里了= =,一直都没找出错误.因为思路是很简单的,肯定是哪里写挫了,因此不再继续追究了. WA的代码如下,希望日后有一天能找出错误= =: —— ...
随机推荐
- Socket(1)
端口号可以从0~65535: 今天就写TCP相关.在下一节我会分别写有关UDP,还有MultiCastSocket. Socket的工作原理: 通信两端都建立一个Socket,从而两端形成虚拟链路.通 ...
- Android--用DownLoadManager下载完成后启动安装
当我们用系统的服务DownLoadManager下载完成后,系统会发送一个广播,我们只需要注册一个广播,然后在广播里面写如一些相应的操作. 1.注册广播 completeReceiver = new ...
- 如何检测某IP端口是否打开
1.如果你直接到控制面板的管理工具里的服务项里去找telnet的话,那是徒劳无功 的,因为默认根本就没有这一服务.当然,你可以通过如下方式搞定.“控制面 板” 一〉“程序” 一〉“打开或关闭windo ...
- WCF 已超过传入消息(65536)的最大消息大小配额。若要增加配额,请使用相应绑定元素上的 MaxReceivedMessageSize 属性
我出现这个问题主要是服务器返回数据量过大引起了,需要客户端服务端都要进行配置:我会说其实有神器的么....(工具=>wcf服务配置编辑器),用工具编辑下,就会完全搞定这个问题,再也不用纠结了 服 ...
- vnext 技术两篇文章和评论
研究vnext的两篇 好文章,重点看评论! http://www.cnblogs.com/shanyou/p/4589930.html http://www.cnblogs.com/shanyou/p ...
- 海蜘蛛ISPV6.1.5,目前破解版本中最稳定的!
海蜘蛛ISPV6.1.5,目前破解版本中最稳定的! 破解步骤如下: 一.安装完毕进控制台 二.使用muddyboot登陆 密码(123456) 三.输入root回车 四.输入regtools回车 五. ...
- Python实现C4.5(信息增益率)
Python实现C4.5(信息增益率) 运行环境 Pyhton3 treePlotter模块(画图所需,不画图可不必) matplotlib(如果使用上面的模块必须) 计算过程 st=>star ...
- Java Day 10
接口应用 多态 猫 x = new 猫(); 动物 x = new 猫(); 父类或接口的引用指向其子类的对象 class BookPC{ public static void main(Strin ...
- Quartz.NET Windows
Quartz.NET Windows 服务示例 想必大家在项目中处理简单的后台持续任务或者定时触发任务的时候均使用 Thread 或者 Task 来完成,但是项目中的这种需求一旦多了的话就得将任务调度 ...
- 基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)
通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...