首页 > 其他分享 >洛谷P10504 守卫者的挑战 题解 概率DP

洛谷P10504 守卫者的挑战 题解 概率DP

时间:2024-09-12 22:51:21浏览次数:8  
标签:洛谷 int 题解 dfs double maxn 挑战 return 守卫者

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

状态 \(f_{i, s, k}\) 表示:

  • 当前正面临第 \(i\) 项挑战(此时第 \(1 \sim i-1\) 项挑战已完成,第 \(i\) 项挑战还没开始);
  • 目前已经挑战成功了 \(s\) 项(即第 \(1 \sim i-1\) 项挑战中共有 \(s\) 项挑战成功,\((i-1)-s\) 项没挑战成功);
  • 此时的背包容量剩余 \(k\)(实际实现时加了一个 \(210\) 的偏移)。

边界条件时 \(i = n+1\),此时第 \(1\) 至 \(i-1 = n\) 项挑战均已挑战完成。

此时若 \(s \ge L\)(至少挑战成功 \(L\) 次) 且 \(k \ge 0\)(背包足够装所有的地图残片),则获胜的概率为 \(1\);否则,获胜的概率为 \(0\)。

非边界情况下:

\(f_{i, s, k}\) 有 \(p_i\) 的概率转移到 \(f_{i+1, s+1, k + a_i}\),有 \(1 - p_i\) 的概率转移到 \(f_{i+1, s, k}\),所以:

\[f_{i, s, k} = p_i \times f_{i+1, s+1, k + a_i} + (1 - p_i) \times f_{i+1, s, k} \]

示例程序:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 220;
bool vis[maxn][maxn][maxn*2];
double f[maxn][maxn][maxn*2];
int n, L, K, a[maxn];
double p[maxn];

// 当前在第 i 局,目前已经赢了 s 局,剩余背包容量为 k
double dfs(int i, int s, int k) {
    k = min(k, maxn*2-1);
    if (i == n+1) {
        return k >= 210 && s >= L ? 1 : 0;
    }
    if (vis[i][s][k])
        return f[i][s][k];
    vis[i][s][k] = true;
    return f[i][s][k] = p[i] * dfs(i+1, s+1, k + a[i]) + (1 - p[i]) * dfs(i+1, s, k);
}

int main() {
    cin >> n >> L >> K;
    for (int i = 1; i <= n; i++) {
        cin >> p[i];
        p[i] /= 100.0;
    }
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    double res = dfs(1, 0, K + 210); // 初始背包容量为 K
    printf("%.6lf\n", res);
    return 0;
}

标签:洛谷,int,题解,dfs,double,maxn,挑战,return,守卫者
From: https://www.cnblogs.com/quanjun/p/18411285

相关文章

  • [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......
  • 洛谷题单指南-分治与倍增-P1226 【模板】快速幂
    原题链接:https://www.luogu.com.cn/problem/P1226题意解读:快速幂模版题。解题思路:1、分治法要计算a^b,可以对b分情况讨论:如果b是偶数,即b=2t,a^b=a^t*a^t如果b是奇数,即b=2t+1,a^b=a*a^t*a^t很容易用递归实现100分代码:#include<bits/stdc++.h>usingnamespa......
  • 洛谷题单指南-分治与倍增-P1966 [NOIP2013 提高组] 火柴排队
    原题链接:https://www.luogu.com.cn/problem/P1966题意解读:计算两个序列∑(ai​−bi​)^2的最小值,对10^8-3取模。解题思路:1、贪心思路要使得两个序列对应位置元素之差的平方和最小,必须满足两个序列相对排序是一致的,什么意思?设a序列有两个元素:a1,a2,b序列有两个元素b1,b2当a1<a2,b......
  • LOJ4222 「IOI2024」马赛克上色 题解
    题目描述给定长为\(n\)、下标从零开始的\(01\)序列\(x,y\),保证\(x_0=y_0\)。令\(col_{0,j}=x_j,col_{i,0}=y_i\),对\(\forall1\lei\ltn,1\lej\ltn\),\(col_{i,j}=[col_{i-1,j}=0\andcol_{i,j-1}=0]\)。\(q\)次询问,给定\(u,d,l,r\),求\(\sum_{i=u}^d......