有没有小哥哥帮帮忙看看这份代码哪里有问题QWQ谢谢!
思路是用 gi 表示波特走到 i 的概率,有 gi=j=i−d∑min(i−1,l−1)gj/d。然后 fi 表示我已经到达了 i 了,接下来的最大胜率,倒着 DP 一下。
#include<bits/stdc++.h>
#define ll long long
#define eb emplace_back
#define mk make_pair
#define N 400009
#define db double
using namespace std;
int n,l,d;db f[N],s[N],g[N],s1[N];
inline db cc(int i){return (n<=l+d-1?s[l+d-1]-s[n]:0)+(i>=l?(s[i-1]-s[l-1]):0);}
signed main(){
scanf("%d%d%d",&n,&l,&d);
g[0]=s[0]=1;
for(int i=1;i<=l+d-1;i++){
int L=max(0,i-d),R=min(l-1,i-1);
g[i]=(s[R]-(L?s[L-1]:0))/d;s[i]=s[i-1]+g[i];
}
f[n]=s1[n]=cc(n);
for(int i=n-1;i>=0;i--){
int L=i+1,R=min(i+d,n);
f[i]=max(cc(i),(s1[L]-s1[R+1])/d),s1[i]=s1[i+1]+f[i];
}
printf("%.7lf",f[0]);
return 0;
}