代码如下:
我的思路是 e[i][j] 表示区间 [i,j] 里面所有石子都被合并起来以后的期望得分,因为最终合成这个区间的一定是两堆石子且选择是随机的,所以我就用了区间 DP 来计算期望,可以看到我代码中最后计算期望的部分:当前区间的期望 等于 所有可能合成当前区间的两堆石子的期望得分和取平均后再加上当前区间本次合成的得分(一定是 [i,j] 所有石子堆大小的和)
但这样做和答案会有说大不大,说小不小的偏差,请问是为什么?错在哪里?
#include<bits/stdc++.h>
using namespace std;
const int maxn=514;
int n;
double a[maxn];
double e[maxn][maxn];
double sum[maxn];
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);cout.tie(nullptr);
cin>>n;
sum[0]=0.00;
for(int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
for(int len=2;len<=n;len++){
for(int st=1;st+len-1<=n;st++){
for(int br=st;br<st+len-1;br++){
e[st][st+len-1]+=e[st][br]+e[br+1][st+len-1];
}
e[st][st+len-1]/=double(len-1);
e[st][st+len-1]+=sum[st+len-1]-sum[st-1];
}
}
cout<<fixed<<setprecision(9)<<e[1][n]<<endl;
return 0;
}