首页 > 其他分享 >P5531 [CCO2019] Human Error 题解

P5531 [CCO2019] Human Error 题解

时间:2024-05-24 15:41:38浏览次数:18  
标签:P5531 dbl int 题解 fro Human define dp op

可能是一个比较劣的做法。

但复杂度是对的。

思路

我们容易发现状态数非常的稀少。

一个比较宽松的上限时 \(3^{13}\) 种状态

由于每个点每走一步会吃掉一个棋子。

所以实际的状态是远远达不到这个上限。

那么我们可以直接设 \(dp_{i,0/1,0/1}\) 为在 \(i\) 状态下,目前是 Justin 或 Donald 操作,先手赢得概率与后手赢得概率。

转移可以直接把所有后继找出来排序,取前 \(k\) 大即可。

时间复杂度:\(O(Sn^2\log n)\),\(S\) 为状态数。

Code

#include <bits/stdc++.h>
using namespace std;

#define x first
#define y second
// #define int long long
#define mp(x, y) make_pair(x, y)
#define eb(...) emplace_back(__VA_ARGS__)
#define fro(i, x, y) for (int i = (x); i <= (y); i++)
#define pre(i, x, y) for (int i = (x); i >= (y); i--)
inline void JYFILE19();

typedef double dbl;
typedef pair<int, int> PII;

bool ST;
const int N = 14;
const int M = 2e6 + 10;
const int mod = 998244353;

int n, m, f[2], ct;
int a[N], id[N][N];
dbl dp[M][2][2];
string s[N];
vector<int> to[N];
int vx[] = {0, 1, 0, -1};
int vy[] = {1, 0, -1, 0};

inline void dfs(int now, int op) {
  vector<dbl> res;
  int a[N]{}, s = now;
  pre(i, ct, 1) a[i] = s % 3, s /= 3;
  fro(i, 1, ct) {
    if (a[i] == op + 1) {
      for (auto j : to[i]) {
        if (a[j]) {
          int x = a[j], y = a[i], nt = 0;
          a[j] = y, a[i] = 0;
          fro(k, 1, ct) nt = nt * 3 + a[k];
          dfs(nt, op ^ 1);
          res.eb(dp[nt][op ^ 1][op]);
          a[j] = x, a[i] = y;
        }
      }
    }
  }
  sort(res.begin(), res.end(), [&](dbl x, dbl y) { return x > y; });
  dbl sum = 0;
  int h = f[op];
  for (auto i : res) {
    if (h == 0) break;
    h--, sum += i;
  }
  if(h != f[op]) dp[now][op][op] = sum / (f[op] - h);
  dp[now][op][op ^ 1] = 1 - dp[now][op][op];
}

signed main() {
  JYFILE19();
  cin >> n >> m;
  fro(i, 1, n) cin >> s[i];
  cin >> f[0] >> f[1];
  fro(i, 1, n) fro(j, 1, m) id[i][j] = ++ct;
  fro(i, 1, n) fro(j, 1, m) fro(k, 0, 3) {
    int x = i + vx[k];
    int y = j + vy[k];
    if (1 <= x && x <= n && 1 <= y && y <= m) {
      to[id[i][j]].eb(id[x][y]);
    }
  }
  ct = 0;
  fro(i, 1, n) {
    fro(j, 1, m) {
      if (s[i][j - 1] == 'J') a[++ct] = 1;
      if (s[i][j - 1] == 'D') a[++ct] = 2;
    }
  }
  int now = 0;
  fro(i, 1, ct) now = now * 3 + a[i];
  dfs(now, 0);
  printf("%.3lf\n", dp[now][0][0]);
  return 0;
}

bool ED;
inline void JYFILE19() {
  // freopen("", "r", stdin);
  // freopen("", "w", stdout);
  ios::sync_with_stdio(0), cin.tie(0);
  double MIB = fabs((&ED - &ST) / 1048576.), LIM = 500;
  cerr << "MEMORY: " << MIB << endl, assert(MIB <= LIM);
}

标签:P5531,dbl,int,题解,fro,Human,define,dp,op
From: https://www.cnblogs.com/JiaY19/p/18211079

相关文章

  • Codeforces Global Round 12 C2. Errich-Tac-Toe (Hard Version) 题解 构造
    Errich-Tac-Toe(HardVersion)题目描述TheonlydifferencebetweentheeasyandhardversionsisthattokensoftypeOdonotappearintheinputoftheeasyversion.ErrichtogaveMonogonthefollowingchallengeinordertointimidatehimfromtakingh......
  • 蓝桥楼赛第30期-Python-第二天赛题 题解
    楼赛第30期Python模块大比拼解析网页元素目标本次挑战,我们需要使用Python访问软科世界大学排行榜来获取首页30所学校的信息。为避免目标网站的内容发生变化,我们使用保存之后的网页进行实验。链接如下:https://labfile.oss.aliyuncs.com/courses/4070/rank2021.h......
  • 优美子序列 题解
    有n个整数从左往右排成一行,构成一个序列a。如果通过删除原序列的若干个数(可以是删除0个),其他数保持位置不动,那么得到的序列就称为“子序列”。记sum表示序列a的所有数的总和,即sum=a[1]+a[2]+a[3]+...+a[n]。如果一个“子序列”的各个数加起来的和等于sum-1,那么这个“子序列”......
  • 题解:聪聪与可可(概率与期望)
    [NOI2005]聪聪与可可题目描述在一个魔法森林里,住着一只聪明的小猫聪聪和一只可爱的小老鼠可可。虽然灰姑娘非常喜欢她们俩,但是,聪聪终究是一只猫,而可可终究是一只老鼠,同样不变的是,聪聪成天想着要吃掉可可。一天,聪聪意外得到了一台非常有用的机器,据说是叫GPS,对可可能准确的定位......
  • [Usaco2017 Open]Bovine Genomics 题解^&*^(
    不知道为啥,我死活想不到二分(楼下正解)所以,就有了这篇题解可以看到,这道题离暴力的距离只有一步!就是数组开不下!!小问答:数组开不下时,你会?A:mapB:优化代码C:gp_hash_table由于正在学hash,所以容易想到...tong[本来的下标%9999999]然后就玄学的过了。。。ACcode#include<bi......
  • 【转载】2024年度山东省自然科学基金项目(第一批)申报常见问题解答
    地址:https://mp.weixin.qq.com/s?__biz=Mzg2NDU5NjA1OQ==&mid=2247579452&idx=2&sn=a038e35fb2958666ab255993008c8064&chksm=ce650e08f912871e77d05569567a15fdffcbedd6a1762a19433b4aabcdcbdf96272d52e28112&mpshare=1&scene=23&srcid=0523SHJ0......
  • Vue 使用 Devextreme框架,下拉框不会随页面的滚动而移动的问题解决
    Devextreme的DxSelectBox组件的下拉选项部分,默认是绝对位置布局,导致页面滚动时,下拉部分不会上下移动个人的解决方案,监听页面滚动事件,如果目前有打开的下拉框,先关闭下拉框,随后迅速再打开,视觉效果上可以做到下拉选项跟随组件滚动vue项目中可能会有很多页面,很多下拉框,我是用的给每......
  • NPOI创建word文档,使用unicode写入打勾的小方框,word2021显示异常问题解决
    word2019查看NPOI创建的word中打勾方框,显示正常,但是word2021显示就变成下面这个样子了,应该是word2021对这个特殊字符的渲染导致的 想要普通的效果,白色背景黑边黑勾的效果,换一个字体可以解决 c# 代码XWPFDocumentdocument=newXWPFDocument();XWPFParagraphparagrap......
  • Java RMI遇到的Connection refused to Host: 127.x.x.x/192.x.x.x/10.x.x.x问题解决方
    问题故障解决记录--JavaRMIConnectionrefusedtohost:x.x.x.x....在学习JavaRMI时,我遇到了以下情况问题原因:可能大家的host是10或者192的私有地址,我估计都是和我一样的一个原因:/etc/hosts文件的配置问题(我是ubuntu系统下的实验环境),也就是主机名称和IP地址的映射关系......
  • Git:warning: CALF wilL be replaced by LF in xxxx 问题解决
    warning:CALFwilLbereplacedbyLFinxxxx问题解决办法出现这个问题的原因是像缓存区中提交文件时出现的 原因:windows中的换行符为CRLF,而在Linux下的换行符为LF,所以在执行add.时出现提示也就是,工作区的文件都应该用CRLF来换行。如果 改动文件时引入了LF,提......