首页 > 其他分享 >洛谷P8208 [THUPC2022 初赛] 骰子旅行 题解 期望DP

洛谷P8208 [THUPC2022 初赛] 骰子旅行 题解 期望DP

时间:2024-09-13 12:51:06浏览次数:1  
标签:洛谷 int 题解 ll 初赛 res return mod 105

题目链接:https://www.luogu.com.cn/problem/P8208

解题思路:

定义 \(d_u\) 表示节点 \(u\) 的出度,定义 \(V_u\) 表示节点 \(u\) 一步能够走到的节点的集合。

定义状态 \(p_{u, c, v}\) 表示从节点 \(u\) 出发走恰好 \(c\) 步的情况下,至少经过一次节点 \(v\) 的概率。

则:

  • 若 \(v = u\),则 \(p_{u, c, v} = 1\);
  • 否则,若 \(c = 0\),则 \(p_{u, c, v} = 0\);
  • 否则,\(p_{u, c, v} = \frac{1}{d_u} \sum\limits_{x \in V_u} p(x, c-1, v)\)

定义 \(f_{u, c}\) 表示从节点 \(u\) 开始走恰好 \(c\) 步,废话指数的期望值,则:

  • 若 \(c = 0\),则 \(f_{u, 0} = 0\);
  • 否则,\(f(u, c) = \frac{1}{d_u} \sum\limits_{v \in V_u} f(v, c-1) + v \times p(v, c-1, u)\)

注:这道题目的意思有点绕 如果是从 \(u\) 先走到 \(v\),然后再绕回 \(u\),则额外增加的代价是 \(v\),而不是 \(u\)。所以会看见,上式中额外增加的代价是 \(v\) 而不是 \(u\)。即标下划线的部分:

\[f(u, c) = \frac{1}{d_u} \sum\limits_{v \in V_u} f(v, c-1) + \underline{v} \times p(v, c-1, u) \]

这里是 \(v\) 不是 \(u\)。

示例程序:

#include <bits/stdc++.h>
using namespace std;
const long long mod = 998244353;
typedef long long ll;
void gcd(ll a , ll b , ll &d , ll &x , ll &y) {
    if(!b) {d = a; x = 1; y = 0;}
    else { gcd(b , a%b,d,y , x); y -= x * (a/b); }
}
ll inv(ll a , ll n = mod) {
    ll d , x , y;
    gcd(a , n , d,  x , y);
    return d == 1 ? (x+n)%n : -1;
}

ll p[105][105][105], f[105][105], d[105];
bool visp[105][105][105], visf[105][105];
vector<int> g[105];
int n, s, T;

ll dfsp(int u, int c, int v) {
    if (v == u) return 1;
    if (c == 0) return 0;
    if (visp[u][c][v])
        return p[u][c][v];
    visp[u][c][v] = true;
    ll res = 0;
    for (auto x : g[u])
        res += dfsp(x, c-1, v),
        res %= mod;
    res = res * inv(d[u]) % mod;
    return p[u][c][v] = res;
}

ll dfsf(int u, int c) {
    if (c == 0) return 0;
    if (visf[u][c])
        return f[u][c];
    visf[u][c] = true;
    ll res = 0;
    for (auto v : g[u])
        res += dfsf(v, c-1) + v * dfsp(v, c-1, u) % mod,
        res %= mod;
    res = res * inv(d[u]) % mod;
    return f[u][c] = res;
}

int main() {
    cin >> n >> s >> T;
    for (int u = 1; u <= n; u++) {
        cin >> d[u];
        for (int j = 0; j < d[u]; j++) {
            int v;
            cin >> v;
            g[u].push_back(v);
        }
    }
    cout << dfsf(s, T) << endl;
    return 0;
}

标签:洛谷,int,题解,ll,初赛,res,return,mod,105
From: https://www.cnblogs.com/quanjun/p/18412003

相关文章

  • 题解 P4827【[国家集训队] Crash 的文明世界】
    从阶乘幂到斯特林数-caijianhong-博客园(cnblogs.com)题目描述Crash小朋友最近迷上了一款游戏——文明5(CivilizationV)。在这个游戏中,玩家可以建立和发展自己的国家,通过外交和别的国家交流,或是通过战争征服别的国家。现在Crash已经拥有了一个\(n\)个城市的国家,这......
  • 题解:CF1767E Algebra Flash
    可以在cnblogs中阅读。\(m\le40\)的数据范围提示让我们往颜色种类上考虑。由题每次可以跳\(1\)或\(2\)格,即存在一条从\(1\)到\(n\)的路径的充要条件是不存在两个相邻的未激活格。换句话说,对任意两个相邻的格子都必须选择至少一个激活。任意两个,至少一个,这样的条件......
  • 洛谷P10504 守卫者的挑战 题解 概率DP
    题目链接:https://www.luogu.com.cn/problem/P10504状态\(f_{i,s,k}\)表示:当前正面临第\(i\)项挑战(此时第\(1\simi-1\)项挑战已完成,第\(i\)项挑战还没开始);目前已经挑战成功了\(s\)项(即第\(1\simi-1\)项挑战中共有\(s\)项挑战成功,\((i-1)-s\)项没挑战成功);......
  • [ARC101E] Ribbons on Tree 题解
    [ARC101E]RibbonsonTree题解其实算一道好题了。首先考虑不相关的simple的dp。平凡的想法是设\(dp_{i,j}\)表示\(i\)子树内有\(j\)个点还需要向上转移的方案数。转移式大概是个\(dp_{x,i+j}=dp_{y,i+j-1}+(dp_{p,i-1}+dp_{q,j-1})\)之类的东西。这样的dp是\(O(......
  • 今日打卡:洛谷:P1248 加工生产调度/P1251 餐巾计划问题
    昨天虽然打了卡,但是因为时间问题,所以没做题,今天补回来。今天的运势也真服了,我今天没出过门,也不会装逼啊!还有,我不开电脑怎么做题啊?请教问题也找不到人啊!P1248加工生产调度:#include<bits/stdc++.h>usingnamespacestd;structnumber{ intnum,ind; boolsign; boolo......
  • 题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++
    题目传送门:105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/每次在中序遍历序列片段中找到前序遍历序列队首,这是该层的根节点该位置左侧是左子树,右侧是右子树再......
  • P3267 [JLOI2016/SHOI2016] 侦察守卫 题解
    P3267[JLOI2016/SHOI2016]侦察守卫题解\(n\le5\times10^5,D\le20\)的数据范围显然想到\(O(nd)\)的树形dp。考虑\(d\)这一维的状态设计。考虑\(i\)子树中的情况分为全部被覆盖和未全部被覆盖两种。对于第一种,显然我们要考虑子树中能向上覆盖影响的点的个数,于是设......
  • P11030 『DABOI Round 1』Blessings Repeated题解
    P11030『DABOIRound1』BlessingsRepeated题解【形式化题意】给定一个正整数\(k\)和两个字符串\(S,T\)。设字符串\(s\)为\(k\)个字符串\(S\)首尾相接得到的字符串,\(n=\verts\vert,m=\vertT\vert\)。设答案集合\(P=\{(i_0,i_1,\dots,i_{m-1})\mid0\lei......
  • CTS2024 题解
    \(\text{ByDaiRuiChen007}\)D1T1.水镜ProblemLink给定\(a_1\sima_n\),求多少个\([l,r]\)满足存在实数\(L\),将若干个\(a_i\)变成\(2L-a_i\)后\(a_l\sima_r\)严格递增。数据范围:\(n\le10^6\)。考虑钦定\(i-1\)翻转/不翻转,\(i\)翻转/不翻转,容易发现......
  • 【题解】Solution Set - NOIP2024集训Day27 树形 dp
    【题解】SolutionSet-NOIP2024集训Day27树形dphttps://www.becoder.com.cn/contest/5521「HDU4661」MessagePassing「BZOJ3935」Rbtree「ARC101E」RibbonsonTree「AGC034E」CompleteCompress「COCI2014.10」Kamp「SCOI2015」小凸玩密室「AGC008F」Black......