loj6295. 无意识之外的捉迷藏

题意

略。

题解

神仙纳什均衡。
首先,这张图是个有向无环图,大大简化了问题。
为了方便,我们将追捕者叫做A,被追捕者叫做B。
考虑在上面dp,设\(f_{x, y, t}\)为当前在\(t\)时刻末,且A在点\(x\),B在点\(y\)时的期望得分。(注意,A要最小化这个期望得分,B要最大化这个期望得分)
假设我们已经知道了\(t + 1\)时刻各种情况的答案,则考虑A和B如何做出最优决策。
做出最优决策,可以从A的角度单方面考虑,理解为A在以概率数组\(\{p_i\}\)对所有转移状态作决策时,B能做出一种相应的决策以最大化得分,而A要做出一个最优决策(对应一个最优的\(\{p_i\}\)),使得B最大化的得分是A能做的所有决策中最小的。
以上也就是纳什均衡的模型。
关于本题的一些简单情形的纳什均衡模型可以看这里提到的。
重要的是把这个纳什均衡模型转化为一个可用数学语言表达的东西。
设\(e_{i, j}\)为A做出第\(i\)种决策,B做出第\(j\)种决策的期望得分,并设A有\(n\)种决策,B有\(m\)种决策,当前的期望得分为\(S\),则
\[
\text{minimize} \ S \\sum_{i = 1} ^ n p_i = 1 \\forall j \in [1, m], \sum_{i = 1} ^ n p_i e_{i, j} \leq S
\]
变换一下,\(x_i = \frac{p_i}{S}\),则\(S = \frac{1}{\sum x_i}\),有
\[
\text{minimize} \sum_{i = 1} ^ n x_i \\forall j \in [1, m], \sum_{i = 1} ^ n x_i e_{i, j} \leq 1
\]
则用单纯形求解即可。复杂度不关键,关键是跑的很快。
坠痛苦的是单纯形不会打了

#include <bits/stdc++.h>
using namespace std;
typedef double db;
const int N = 45;
const db eps = 1e-8, inf = 1e9;
int n, m, t, sr, sk;
bool vis[N][N][N];
db dp[N][N][N];
vector <int> g[N];
void add (int x, int y) {
    g[x].push_back(y);
}
namespace LinearPro {
    int n, m, id[N]; db a[N][N];
    // id means x_id[i] sits on the position where x_i originally sat
    void pivot (int b, int nb) {
        swap(id[b + n], id[nb]);
        db k = -a[b][nb]; a[b][nb] = -1;
        for (int i = 0; i <= n; ++i) {
            a[b][i] /= k;
        }
        for (int i = 0; i <= m; ++i) {
            if (a[i][nb] && i != b) {
                k = a[i][nb], a[i][nb] = 0;
                for (int j = 0; j <= n; ++j) {
                    a[i][j] += a[b][j] * k;
                }
            }
        }
    }
    void init () {
        for (int i = 1; i <= n + m; ++i) {
            id[i] = i;
        }
        for ( ; ; ) {
            int b = 0, nb = 0; double w = -eps;
            for (int i = 1; i <= m; ++i) {
                if (a[i][0] < w) {
                    b = i, w = a[i][0];
                }
            }
            if (!b) {
                break;
            }
            for (int i = 1; i <= n; ++i) {
                if (a[b][i] > eps) {
                    nb = i;
                    break;
                }
            }
            pivot(b, nb);
        }
    }
    db simplex () {
        for ( ; ; ) {
            int b = 0, nb = 0; double w = eps;
            for (int i = 1; i <= n; ++i) {
                if (a[0][i] > w) {
                    nb = i, w = a[0][i];
                }
            }
            if (!nb) {
                break;
            }
            w = inf;
            for (int i = 1; i <= m; ++i) {
                if (a[i][nb] < -eps) {
                    if (-a[i][0] / a[i][nb] < w) {
                        b = i, w = -a[i][0] / a[i][nb];
                    }
                }
            }
            pivot(b, nb);
        }
        db ret = 0;
        for (int i = 1; i <= m; ++i) {
            if (id[n + i] <= n) {
                ret += a[i][0];
            }
        }
        return 1.0 / ret;
    }
}
db dfs (int x, int y, int z) {
    if (vis[x][y][z]) {
        return dp[x][y][z];
    }
    vis[x][y][z] = 1;
    if (x == y) {
        return dp[x][y][z] = 0;
    }
    if (z == t) {
        return dp[x][y][z] = 1;
    }
    for (auto i : g[x]) {
        for (auto j : g[y]) {
            dfs(i, j, z + 1);
        }
    }
    int n = 0, m = 0;
    for (auto i : g[x]) {
        ++n, m = 0;
        for (auto j : g[y]) {
            LinearPro :: a[++m][n] = dp[i][j][z + 1] + 1;
        }
    }
    for (int j = 1; j <= n; ++j) {
        LinearPro :: a[0][j] = -1;
    }
    for (int i = 1; i <= m; ++i) {
        LinearPro :: a[i][0] = -1;
    }
    LinearPro :: n = n, LinearPro :: m = m;
    LinearPro :: init();
    dp[x][y][z] = LinearPro :: simplex();
    return dp[x][y][z];
}
int main () {
    freopen("in.txt", "r", stdin);
    scanf("%d%d%d%d%d", &n, &m, &sr, &sk, &t);
    for (int i = 1, x, y; i <= m; ++i) {
        scanf("%d%d", &x, &y), add(x, y);
    }
    for  (int i = 1; i <= n; ++i) {
        add(i, i);
    }
    printf("%.3lf\n", dfs(sr, sk, 0));
    return 0;
}

原文地址:https://www.cnblogs.com/psimonw/p/12067715.html

时间: 2024-08-30 10:08:26

loj6295. 无意识之外的捉迷藏的相关文章

java:无意识自动装箱的可怕之处

前言:<effective Java>一书确实经典,真是为没有早一点买到这本书而感到遗憾.再来学习一个小知识,在之前,我只是知道integer是int的装箱类,而int是基本类型而已,从来没有意识到自动装箱有这么大的区别,"要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱." 根据书中所写,我测试了以下的简单例子. package com.mwq.number; public class Test { public static void main(String

意识与无意识

1.有意识的精神,与无意识的精神,如同地上河与地下暗河交替出现,两者流向一致时,河水奔涌向前,两者流向相对时,漩涡而水不前. 2.无意识的精神有几种本能:盈亏本能:防骗本能:自守本能: 3.有意识有限,无意识无限,作用域无止无境,正如睡着时心脏仍在不停的跳动.有意识逆无意识而行,必败.有意识的提升有赖于无意识提供的材料,正如地下水位低,河水就会干涸一样.有意识要驱动无意识,动员出无意识的能量,行为计划不能过于周密,无意识本身有防骗本能,如果觉察则会迅速抽干意识力量,令其陷入干涸,崩溃的境地.有意

无意识的递归

Java中的每个类从根本上都继承自Object,标准容器类自然也不例外.因此容器都有toString()方法,并且覆盖了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象.例如ArrayList.toString(),它会遍历ArrayList中包含的所有对象,调用每个元素上的toString()方法; 如果你希望toString()方法打印出对象的内存地址,也许你会考虑使用this关键字: //: strings/InfiniteRecursion.java // Ac

&lt;Getting Things Done&gt; 搞定I 无压工作的艺术 读书笔记

最近感觉时间管理做的特别差,上周末好多事乱成一锅粥.于是借来同事的书来看,发现真的写的特别好! 在这里挑重点和自己的心得总结一下. 第1章 问题: 1. 现代社会的事情不断涌现,已经不是把事情做个列表,先做重要紧急的,这样简单的做法就能应付得了. 2. 很多要去做的事情被我们存在了大脑里,只是记得需要去做,增加心理压力,却没时间真正去实施.这样的缓存其实是造成我们低效率的一个原因. 目标:做每件事都处于一种忘我的境界,心如止水,享受其中.(我们都曾经无意识地达到过这种最高境界,但是却不能控制自己

弗洛伊德的人格结构说中潜意识,前意识,意识和自我,本我,超我的区别

意识是大脑对客观存在的反应,是个体在任何时刻觉察到的感觉与体验,既有特性又有共性. 人格是人的性格与气质,是个体的特性. 意识分为:显意识.前意识.无意识(=潜意识?=原意识?).弗洛伊德原作中为"无意识",后来被"潜意识"取代,现在又有人用"原意识"描述,但三者还是略有区别. 显意识,也称显层意识,即"思想",是个体人生活在人类群体(社会)所受到影响的结果.显层意识是直接决定人的行为的意识,显层意识也是人区别于动物的显著的质

习惯与自由意识--文摘

<习惯是什么?> http://blog.sina.com.cn/s/blog_536b59bf0100wyzs.html 1我们无法决定“自由做”什么,只能决定“自由不做”什么 2我们可以通过改变内外在环境,来形成新的习惯. 3 对习惯重新定义一下: 普通的定义为:积久养成的生活方式. 新的定义:在特定的环境下,人们会重复做出的某种行为. 4 如何消除坏习惯? 每次只消除一个,因为我们精力有限: 注意外在环境,如时间.周遭环境.和谁在一起,尽量避免: 内在环境:找到你真正需要的,用新方式满足

论意识

一个人 由两部分组成,躯干和意识,躯干是出生的时候就已经存在的,而意识在出生的时候是不存在的,所以意识是后天养成的, 一个人所生活的环境的整体意识就是个人的后天养成的意识的母体,所以个人的意识无法突破母体的意识,因为其全部都是来源于母体,甚至有时候通过逻辑思辨得到母体意识某些部分是错误的,但是却依然不会撼动对母体意识的信仰. 个体意识对母体意识产生动摇的情况只会有三种. 一:母体出现重大问题的时候,母体作为一个整体的反思,这在历史上已经多次验证,春期战国的百家争鸣,魏晋南北朝的玄学,明末清初的君

汉语-词语:意识(心理学名词)

ylbtech-汉语-词语:意识(心理学名词) 现代心理学界对意识的理解分为广义和狭义两种.广义意识概念认定,意识是赋予现实的心理现象的总体,是个人直接经验的主观现象,表现为知.情.意三者的统一.狭义意识概念则指人们对外界和自身的觉察与关注程度. 1.返回顶部 1. 中文名:意识 应用学科:心理学 应用范围:人格心理学 目录 1 概念 2 特性 ? 主观性 ? 同一性 ? 流动性 ? 能动性 3 个体意识 ? 定义 ? 原意识 ? 显意识 4 结构分类 5 相关名言 2. 2.返回顶部 1. 概

肯.威尔伯论觉知

https://tieba.baidu.com/p/4584305679?red_tag=3109625582 1.纯粹的觉知是持续不断的平等的威尔伯重拾消失长达五年之久的写作灵感,他过着离群索居的生活,除了购买日用品之外,几乎完全与世隔绝,三年中只见了四个人,他形容那种情况很像传统的禁语闭关.当时他正埋首于<性.生态学.灵性>这本巨著的撰写工作,他形容其过程就像是一场永无止境的噩梦,为了涵盖四大象限各个领域的知识系统,他需要搜集的资料可想而知有多么博杂了.闭关到第七个月,他患了自称的“渴肤症