题意

\(yyb\)要去与\(m\)\((m\le100)\)个人玩游戏

由于\(yyb\)忙着切大火题,他没有太多的精力浪费在游戏上

所以仁慈的\(yyb\)决定放\(m\)个人一条生路,不吊打他们

然而\(yyb\)为了维护自己红太阳的形象,不能输,所以他希望与每个人玩游戏都能是平局

游戏很简单,就是石头剪刀布,\(yyb\)会与每个人玩\(n(n\le 20)\)场

只要双方赢的次数相同就视为平局

\(yyb\)非常的强,所以大家每一场比赛想出什么\(yyb\)一眼就看出来了

每个人的策略都是一个长度为\(n\)的序列

然后他觉得能用同一个长度为\(n\)的策略序列与每个人打平局

然而\(yyb\)并不满足与这些,他想知道自己有多少种方式打平,这样他就能知道别人比自己弱多少,从而增长自己的淫威

正如大家所知,\(yyb\)秒题入魔,懒得去想这个\(naive\)的比赛

所以请比他弱的你来帮他求出这个方案数

Sol

\(meet \ in \ the \ midlle\)

爆搜,把状态开\(vector\)压进\(map\)查询

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;
typedef vector <int> vi; IL int Input(){
RG int x = 0, z = 1; RG char c = getchar();
for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
return x * z;
} int win[3][3] = {{0, -1, 1}, {1, 0, -1}, {-1, 1, 0}};
int n, m, a[105][25], b[25], mid;
vi tmp;
map <vi, int> t;
ll ans; IL void Record(){
tmp.clear();
for(RG int i = 1; i <= m; ++i){
RG int cnt = 0;
for(RG int j = 1; j <= mid; ++j) cnt += win[a[i][j]][b[j]];
tmp.push_back(cnt);
}
++t[tmp];
} IL void Dfs1(RG int l){
if(l > mid){
Record();
return;
}
for(RG int i = 0; i < 3; ++i) b[l] = i, Dfs1(l + 1);
} IL void Calc(){
tmp.clear();
for(RG int i = 1; i <= m; ++i){
RG int cnt = 0;
for(RG int j = mid + 1; j <= n; ++j) cnt -= win[a[i][j]][b[j]];
tmp.push_back(cnt);
}
ans += t[tmp];
} IL void Dfs2(RG int l){
if(l > n){
Calc();
return;
}
for(RG int i = 0; i < 3; ++i) b[l] = i, Dfs2(l + 1);
} IL ll Solve(){
mid = (1 + n) >> 1;
Dfs1(1), Dfs2(mid + 1);
return ans;
} class EllysRPS{
public:
ll getCount(vector <string> s){
m = s.size(), n = s[0].size();
for(RG int i = 1; i <= m; ++i)
for(RG int j = 1; j <= n; ++j)
if(s[i - 1][j - 1] == 'R') a[i][j] = 0;
else a[i][j] = (s[i - 1][j - 1] == 'S') + 1;
return Solve();
}
};

TopCoder14580: EllysRPS的更多相关文章

  1. Meet in the middle学习笔记

    Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...

随机推荐

  1. 总结day25 ---- udp 初识, 和tcp 进阶

    前情提要 一: tcp 和udp 的区别 # tcp # # 面向连接的 可靠的 全双工的 流式传输 # # 面向连接 :同一时刻只能和一个客户端通信 # # 三次握手.四次挥手 # # 可靠的 :数 ...

  2. NPOI设置水平、垂直居中

    C#语法: string fs = "@report.xls";//文件路径 FileStream excelPath = File.Open(@fs, FileMode.Open ...

  3. mono for android 百度map binding项目(转)

    好丫小子之前发布过百度地图android SDK的mono for android绑定dll,许多朋友看过之后说想理解是怎么绑定的,现我把绑定的代码发出来. 针对2.1.2版本百度地图android ...

  4. (转载)Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码

    1 import java.util.Collections; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public c ...

  5. EasyMock set方法报错: java.lang.AssertionError

    有返回值的方法没问题, 直接andReturn就行了. EasyMock.expect(info.getWebTitle()).andReturn(StringUtils.EMPTY).anyTime ...

  6. WebDriver中的Actions对象

    我们可以利用Actions对象来模拟鼠标的操作以及页面的拖拽 1.模拟鼠标的双击操作: 1)模拟双击一个div,验证点击之前的字体为14号 2)点击后字体为20号 Actions builder = ...

  7. javac的访问者模式

    这一篇重点来总结下javac的访问者模式,其定义的访问者接口为JCTree.Visitor,具体如下: /** A generic visitor class for trees. */ public ...

  8. C#调用SQLite报错:无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块

    C#调用SQLite数据库,有些情况下会报以下这个错误: 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 实际上程序目录中是存在SQLite.Interop.dll这个文 ...

  9. 去除tableView表头悬浮

    UITableView设置为UITableViewStyleGrouped样式会出现多余间距,以前遇到过这样的问题,自己以为不难,只是一个知识点,也没太在意 ,今天又碰到了,发现自己把它给忘了,所以还 ...

  10. vue-cli 中遇见的问题,记录爬坑日常!

    本片文章我将会记录使用vue-cli 以及一些相关插件遇见的问题和解决方案,另外本文章将会持续更新,本着互联网分享精神,希望我所记录的日常能对大家有所帮助. 1.在img和html文件处于同级阶段,i ...