CDOJ 1402 三角形棋盘上的博弈游戏 状压DP
三角形棋盘上的博弈游戏
题目连接:
http://mozhu.today/#/problem/show/1402
Description
柱爷有天上课无聊,于是和同桌卿学姐一起下一种奇特的棋:
棋盘如图:

在开始游戏前,棋盘上已经放好了一些边,然后柱爷先手,开始在棋盘上没有边的位置添加一条边上去
如果添加边后围成一个三角形则获得一分(对于棋盘上游戏开始前已经围好了的三角形,两个人都不得分)并且下一轮还该他!否则下一轮该另一个人。
如果两个人都以最优策略下棋,那么柱爷能赢么?
注:只算最小的三角形!(三个边围成的三角形)
如果能赢输出“WIN!”
必败输出“LOSE!”
平局输出“Draw”
(都不输出引号)
愚人王感觉这规则太抽象了,都没人赶预测柱爷能不能赢了,于是画了个图解释了下题意:

对应:
5
1 2 3 4 5
的情况,如果这是开局情况,那么此时两个人都是0分,改柱爷先下,
如果他在6的位置填一条边,那么4,5,6将围城一个小三角形,柱爷得一分。接下来还是改柱爷下棋。
如果他在18的位置填一条边,那么将无法构成三角形,柱爷不得分,接下来改卿学姐下棋。
一直这样,直到填完所有边后,游戏结束。此时分高的人获胜,分相同则平局。
Input
第一行一个正整数n,表示开始游戏前有多少条边已经被放上去了。
第二行有n个正整数,a1...an代表已经放好的边的编号。
1<=a1...an<=18
Output
一行,输出柱爷的结局。
如果能赢输出“WIN!”
必败输出“LOSE!”
平局输出“Draw”
Sample Input
6
1 2 3 4 5 6
Sample Output
WIN!
Hint
题意
题解:
直接暴力状压dp就好了
dp[i]表示i这个状态的时候,A能够拿到的最多数
注意trick,就是画线的时候,不仅仅可以占据一个三角形,有可能占据两个三角形哦
代码
#include<bits/stdc++.h>
using namespace std;
int dp[1<<21][2];
int Dis[1<<21][2];
int cal(int x)
{
int vis[30];
memset(vis,0,sizeof(vis));
for(int i=1;i<=18;i++)
if((x>>i)&1)
vis[i]=1;
int ans = 0;
for(int i=0;i<6;i++)
if(vis[i*3+1]&&vis[i*3+2]&&vis[i*3+3])
ans++;
if(vis[3]&&vis[5]&&vis[7])ans++;
if(vis[6]&&vis[11]&&vis[13])ans++;
if(vis[9]&&vis[14]&&vis[16])ans++;
return 9-ans;
}
int dfs(int now,int flag)
{
if(Dis[now][flag])return dp[now][flag];
int last = cal(now);
Dis[now][flag]=1;
for(int i=1;i<=18;i++)
{
if(((now>>i)&1)==0)
{
int next = now|(1<<i);
int flag3 = cal(now)-cal(next);
if(flag3>0)
dp[now][flag]=max(dp[now][flag],dfs(next,flag)+flag3);
else
dp[now][flag]=max(dp[now][flag],last-dfs(next,1-flag));
}
}
return dp[now][flag];
}
int main()
{
//freopen("1.in","r",stdin);
int n;
cin>>n;
int now = 0;
for(int i=0;i<n;i++)
{
int x;scanf("%d",&x);
now|=(1<<x);
}
int last = cal(now);
int a = dfs(now,0);
int b = last - a;
//cout<<last<<" "<<a<<" "<<b<<endl;
if(a>b)
cout<<"WIN!"<<endl;
else if(a==b)
cout<<"Draw"<<endl;
else if(a<b)
cout<<"LOSE!"<<endl;
}
CDOJ 1402 三角形棋盘上的博弈游戏 状压DP的更多相关文章
- NowCoder110E Pocky游戏 状压DP
传送门 题意:给出$N$个数和一个长为$M$.所有数在$[1,N]$范围之内的正整数序列$a_i$,求出这$N$个数的一种排列$p_1...p_N$使得$\sum\limits_{i=2}^M |p_ ...
- 牛客练习赛18E pocky游戏 状压dp
正解:状压dp+辅助dp 解题报告: 来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭! 是个好题,可以积累套路,启发性强,而且很难 哦而且状压它也是个 ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m<=15,直接搞肯定不行,考虑一行一行来, 每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑 最后一行必须要同时满足他自己和他上面那行,否则舍去 #inc ...
- JZYZOJ1384 种花小游戏 状压dp
http://172.20.6.3/Problem_Show.asp?id=1384 最开始以为是dfs然后超时了,然后调了半天调成dp,还不如再写一遍... 代码 #include<iost ...
- hdu4778:状压dp+博弈
题目大意: 有g种不同颜色的小球,b个袋子,每个袋子里面有若干个每种小球 两人轮流取袋子,当袋子里面的同色小球有s个时,会合并成一个魔法球,并被此次取袋子的人获得 成功获得魔法球的人可以再次取 求二者 ...
- HihoCoder - 1794:拼三角形 (状压DP)
描述 给定 n 根木棍,第 i 根长度为 ai 现在你想用他们拼成尽量多的面积大于 0 的三角形,要求每根木棍只能被用一次,且不能折断 请你求出最多能拼出几个 输入 第一行一个正整数 n 第二行 n ...
- 洛谷 P1278 单词游戏 【状压dp】
题目描述 Io和Ao在玩一个单词游戏. 他们轮流说出一个仅包含元音字母的单词,并且后一个单词的第一个字母必须与前一个单词的最后一个字母一致. 游戏可以从任何一个单词开始. 任何单词禁止说两遍,游戏中只 ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- cdoj 1141 酱神寻宝 状压dp
酱神寻宝 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1141 Descri ...
随机推荐
- JAVA_OPTS讲解【转】
JAVA_OPTS ,顾名思义,是用来设置JVM相关运行参数的变量. JAVA_OPTS="-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:Ma ...
- C# 执行固定个数任务自行控制进入线程池的线程数量,多任务同时但是并发数据限定
思路来源:http://bbs.csdn.NET/topics/390819824,引用该页面某网友提供的方法. 题目:我现在有100个任务,需要多线程去完成,但是要限定同时并发数量不能超过5个. 原 ...
- docker stack 部署 redis
=============================================== 2019/4/16_第2次修改 ccb_warlock 更新 ...
- ASP .Net Core系统部署到SUSE 16 Linux Enterprise Server 12 SP2 64 具体方案
.Net Core 部署到 SUSE 16 Linux Enterprise Server 12 SP2 64 位中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk ...
- 2017-2018-2 20165301 实验四《Java面向对象程序设计》实验报告
2017-2018-2 20165301 实验四<Java面向对象程序设计>实验报告 一.Android Stuidio的安装测试 实验要求: 参考<Java和Android开发学习 ...
- 20155225 2016-2017-2 《Java程序设计》第十周学习总结
20155225 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 22章网络 22.1网络概览 22.2超文本传输协议(HTTP) 22.2.1 HTTP请求 ...
- 2015309南皓芯实验二 Java面向对象程序设计
一.实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验要求 1.没有Linux基础的同学建议先学习< ...
- 2015309南皓芯《Java程序设计》实验一(Java开发环境的熟悉)实验报告
一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 步骤一(新建文件夹):打开windows下的cmd → 输入cd Code命令进入Code目录 → 输入md 20 ...
- JS格式化时间并比较
JS格式化时间,然后进行比较.工作遇到的情况,然后网上找到的,记下来,下次用! </head> <body> <button onclick="myFuncti ...
- PHP性能调优---php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
虽然通过nginx accesslog可以记录用户访问某个接口或者网页所消耗的时间,但是不能清晰地追踪到具体哪个位置或者说函数慢,所以通过php-fpm慢日志,slowlog设置可以让我们很好的看见哪 ...