提供一个及其简单的正推思路
查看原帖
提供一个及其简单的正推思路
1232566
Wh1t3zZlo楼主2025/1/17 10:30

不会markdown将就着看吧:)

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5, MOD = 998244353;

int x[N], y[N], dp[N];

int ksm(int x, int y)
{
    int res = 1;
    while(y)
    {
        if (y & 1) res = res * x %MOD;
        x = x * x % MOD;
        y >>= 1;
    }
    return res;
}

signed main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];

    for (int i = 1; i <= n; i++)
    {
        int inv = ksm(y[i] - x[i], MOD - 2);
        dp[i] = y[i] * (dp[i - 1] + 1) % MOD * inv % MOD;
    }

    cout << dp[n];
}

正推两种思路 第一种 有(1 - pi)的概率爬上一层 所以期望是 1/(i - pi)次可以爬一层 得到dp转移 dp[i + 1] = 1 / (1 - pi) * (dp[i] + 1) ,因为如果掉落需要重新爬回i位置 所以每次尝试的代价是 1 + dp[i], 相当于爬失败了重置状态的代价

第二种 E(i) = p1 * x1 + p2 * x2+..... E(i + 1) = p1 * (x1 + w1) + ...;所以 E(i + 1) = p1 * x1 + ... + p1 * w1 + ... = E(i) + p1 * w1 + ...; E(i)已知, 而p1 * w1 + p2 * w2 + ...即为pi * dp[i + 1],也就是额外付出的代价 所以dp[i + 1] = dp[i] + 1 + pi * dp[i + 1],将公式化简可得dp[i + 1] = 1 / (1 - pi) * (dp[i] + 1) 感性理解就是有pi的几率我要额外花费掉dp[i + 1]的时间 所以额外花费是pi * dp[i + 1] 但是因为dp[i] + 1这段花费是必须会付出的 跟pi无关 无论你pi是多少一定会有dp[i] + 1的花费 所以dp[i] + 1不用乘以pi 所以总的花费就是dp[i + 1] = dp[i] + 1 * pi * dp[i + 1]

2025/1/17 10:30
加载中...