Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles
题目连接:
http://codeforces.com/gym/100015/attachments
Description
Andy and Ralph are playing a two-player game on a triangular board that looks like the following:
1 2
3
4 5 7 8
6 9
10 11 13 14 16 17
12 15 18
At each turn, a player must choose two adjacent vertices and draw a line segment that connects them.
If the newly drawn edge results in a triangle on the board (only the smallest ones count), then the player
claims the triangle and draws another edge. Otherwise, the turn ends and the other player plays. The
objective of the game is to claim as many triangles as possible. For example, assume that it is Andy’s turn,
where the board has fives edges as shown in the picture below. If Andy draws edge 6, then he will claim the
triangle formed by edge 4, 5, and 6, and continue playing.
Given a board that already has some edges drawn on it, decide the winner of the game assuming that
both Andy and Ralph play optimally. Andy always goes first. Note that if a triangle exists on the board
before the first move, neither player claims it.
Input
The input consists of multiple test cases. Each test case begins with a line containing an integer N,5 !
N ! 10, which indicates the number of edges that are already present on the board before the game begins.
The next line contains N integers, indicating the indices of these edges. The input terminates with a line
with N = 0. For example:
Output
For each test case, print out a single line that contains the result of the game. If Andy wins, then print out
“Andy wins”. If Ralph wins, then print out “Ralph wins”. If both players get the same number of triangles,
then print out “Draw”. Quotation marks are used for clarity and should not be printed. For example, the
correct output for the sample input above would be:
Sample Input
6
1 2 3 4 5 6
5
4 5 6 7 8
0
Sample Output
Andy wins
Ralph wins
Hint
题意
给你一个四层的三角形,一共有18条边
然后A,B两个开始划线,如果当前人划线的时候,正好化成了一个小三角形,他就加一分,并且可以再画
否则就该另外一个人画
然后告诉你一些边已经被画过线了,问你先手是否能够胜利
题解:
直接暴力状压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;
while(cin>>n)
{
if(n==0)break;
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<<"Andy wins"<<endl;
else if(a==b)
cout<<"Draw"<<endl;
else if(a<b)
cout<<"Ralph wins"<<endl;
}
}
Codeforces Gym 100015F Fighting for Triangles 状压DP的更多相关文章
- Codeforces Gym 100015F Fighting for Triangles 状态压缩DP
F Fighting for Triangles Description Andy and Ralph are playing a two-player game on a triangular bo ...
- codeforces gym #101161H - Witcher Potion(状压DP)
题目链接: http://codeforces.com/gym/101161/attachments 题意: 总共有n瓶药可供选择 每瓶药可以增加$e_i$点体力,和$p_i$点毒性 每分钟消耗1点毒 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- Codeforces 375C - Circling Round Treasures(状压 dp+最短路转移)
题面传送门 注意到这题中宝藏 \(+\) 炸弹个数最多只有 \(8\) 个,故考虑状压,设 \(dp[x][y][S]\) 表示当前坐标为 \((x,y)\),有且仅有 \(S\) 当中的物品被包围在 ...
- Codeforces Beta Round #16 E. Fish (状压dp)(概率dp)
Codeforces Beta Round #16 (Div. 2 Only) E. Fish 题目链接:## 点击打开链接 题意: 有 \(n\) 条鱼,每两条鱼相遇都会有其中一只吃掉对方,现在给你 ...
- Codeforces 580D Kefa and Dishes(状压DP)
题目大概说要吃掉n个食物里m个,吃掉各个食物都会得到一定的满意度,有些食物如果在某些食物之后吃还会增加满意度,问怎么吃满意度最高. dp[S][i]表示已经吃掉的食物集合是S且刚吃的是第i个食物的最大 ...
- CodeForces 385 D.Bear and Floodlight 状压DP
枚举灯的所有可能状态(亮或者不亮)(1<<20)最多可能的情况有1048576种 dp[i]表示 i 状态时灯所能照射到的最远距离(i 的二进制中如果第j位为0,则表示第j个灯不亮,否则就 ...
- Codeforces 599E Sandy and Nuts(状压DP)
题目链接 Sandy and Nuts 题意大概就是给出限制条件求出在该限制条件下树的种数. #include <bits/stdc++.h> using namespace std; # ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
随机推荐
- [转]Linux之type命令
转自:http://codingstandards.iteye.com/blog/831504 用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下之一 alias 别名 keywo ...
- 大数据处理-bitmap是个神马东西
1. Bit Map算法简介 所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省. 2. B ...
- Firefox 对条件判断语句块内的函数声明的处理与其他浏览器有差异
标准参考 函数声明和函数表达式 定义一个函数有两种途径:函数声明和函数表达式. 函数声明: function Identifier ( FormalParameterList opt ) { Func ...
- Linker scripts之Intro
1 Intro Every link is controlled by a linker script. The main purpose of the linker script is to des ...
- IIS启动出错解决方法
IIS出现server application error,最终解决办法2007年10月30日 星期二 20:38Server Application Error The server has enc ...
- 如何注册AWS Global账号
去年底AWS宣布落地中国以来,可能很多童鞋都在热切地等待试用AWS中国的服务.但是AWS中国目前还在犹抱琵琶半遮面,没有完全向大家开放.不过,大家也不必干等待.要是真感兴趣的话可以自己或者让公司先注册 ...
- python添加windows域验证
1.安装python-ldap https://pypi.python.org/pypi/python-ldap/ 在 Ubuntu/Debian 下安装 python-ldap 模块: $ sudo ...
- Spark给我们带来了什么惊喜?
Spark的一站式解决方案有很多的优势,具体如下.(1)打造全栈多计算范式的高效数据流水线 Spark支持复杂查询. 在简单的“map”及“reduce”操作之外,Spark还支持SQL查询. ...
- MacOSX快捷键
[MacOSX快捷键] 关闭显示器:Shift + Ctrl + 退出键 休眠:Command + Option + 退出键 关机:Ctrl + Option + Command + 退出键 打开文件 ...
- [iOS微博项目 - 2.2] - 在app中获取授权
github: https://github.com/hellovoidworld/HVWWeibo A.发送授权请求 1.使用UIWebView加载请求页面 自定义一个继承UIViewContr ...