ABC189 F - Sugoroku2(期望dp)

本文解析了一个涉及动态规划的数学问题,通过设定期望次数函数f(x),讨论了如何根据标记点和递推关系f(x)=k*f(0)+b来求解从点x到终点的期望次数,特别关注了f(0)的求解过程。代码实例展示了如何利用双数组和辅助变量维护k和b来求解该问题。
摘要由CSDN通过智能技术生成
题意:

在这里插入图片描述

解法:

设 f ( x ) 为 从 点 x 到 达 终 点 的 期 望 次 数 , 那 么 : 1. 当 x > = n 时 , f ( x ) = 0. 2. 如 果 x 被 标 记 , 那 么 f ( x ) = f ( 0 ) . 3. 其 他 情 况 f ( x ) = f ( x + 1 ) + f ( x + 2 ) . . . f ( x + m ) m + 1. 因 为 有 f ( 0 ) 存 在 , 那 么 一 定 是 f ( x ) = k f ( 0 ) + b 的 形 式 , 对 于 每 个 位 置 , 维 护 一 下 k 和 b 即 可 . 最 后 f ( 0 ) = k f ( 0 ) + b , 如 果 k = 1 , 那 么 无 解 , 否 则 ( 1 − k ) f ( 0 ) = b , 可 解 得 f ( 0 ) = b 1 − k . 设f(x)为从点x到达终点的期望次数,那么:\\ 1.当x>=n时,f(x)=0.\\ 2.如果x被标记,那么f(x)=f(0).\\ 3.其他情况f(x)=\frac{f(x+1)+f(x+2)...f(x+m)}{m}+1.\\ 因为有f(0)存在,那么一定是f(x)=kf(0)+b的形式,\\ 对于每个位置,维护一下k和b即可.\\ 最后f(0)=kf(0)+b,如果k=1,那么无解,\\ 否则(1-k)f(0)=b,可解得f(0)=\frac{b}{1-k}. f(x)x,:1.x>=n,f(x)=0.2.x,f(x)=f(0).3.f(x)=mf(x+1)+f(x+2)...f(x+m)+1.f(0),f(x)=kf(0)+b,,kb.f(0)=kf(0)+b,k=1,,(1k)f(0)=b,f(0)=1kb.

code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e6+5;
double sumK[maxm];
double sumB[maxm];
double K[maxm];
double B[maxm];
int mark[maxm];
int n,m,k;
signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>m>>k;
    for(int i=1;i<=k;i++){
        int x;cin>>x;
        mark[x]=1;
    }
    K[n]=0,B[n]=0;
    for(int i=n-1;i>=0;i--){
        int l=i+1,r=i+m;
        if(mark[i]){
            K[i]=1,B[i]=0;
        }else{
            K[i]=(sumK[l]-sumK[r+1])/m;
            B[i]=(sumB[l]-sumB[r+1])/m+1;
        }
        sumK[i]=sumK[i+1]+K[i];
        sumB[i]=sumB[i+1]+B[i];
    }
    if(K[0]==1){
        cout<<-1<<endl;
        return 0;
    }
    double ans=B[0]/(1-K[0]);
    printf("%.10f\n",ans);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值