刚学动态规划的初三学妹求帮助
查看原帖
刚学动态规划的初三学妹求帮助
461616
Judgelight楼主2024/2/26 21:57

有没有小哥哥帮帮忙看看这份代码哪里有问题QWQ谢谢!

思路是用 gig_i 表示波特走到 ii 的概率,有 gi=∑j=i−dmin⁡(i−1,l−1)gj/dg_i=\sum\limits_{j=i-d}\limits^{\min(i-1,l-1)}g_j/d。然后 fif_i 表示我已经到达了 ii 了,接下来的最大胜率,倒着 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;
} 
2024/2/26 21:57
加载中...