题解 AT4531 Sushi
AT4531 Sushi
题目传送门
更好的阅读体验
暴力dp
首先我们考虑最暴力的做法,用
合并状态
(注意该方程并不能构成转移方程,因为当第
注意到由于随机数是均匀选取的,那么盘子的位置是无关紧要的,而只有剩 余数量有影响。于是相同数值的不同排列的期望次数必然是相同的。例如
所以只需要考虑每种数值出现的次数。因为
有了状态,我们通过枚举当前随机到的盘子里还剩几只寿司得到如下方程:
移项整理得到转移方程:
消除无用状态
但由于
注意到任意时刻下,
本题参考程序如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const double eps=1e-8;
const int INF=0x3f3f3f3f;
const int maxn=1e5+5;
const int maxm=1e6+5;
double f[305][305][305];
int a[5],n;
int main(int argc,char const *argv[]){
scanf("%d",&n);
for(int i=1,x;i<=n;++i){
scanf("%d",&x);
a[x]++;
}
for(int k=0;k<=n;++k){
for(int j=0;j<=n;++j){
for(int i=0;i<=n;++i){
if(i||j||k){
if(i)f[i][j][k]+=f[i-1][j][k]*i/(i+j+k);
if(j)f[i][j][k]+=f[i+1][j-1][k]*j/(i+j+k);
if(k)f[i][j][k]+=f[i][j+1][k-1]*k/(i+j+k);
f[i][j][k]+=(double)n/(i+j+k);
}
}
}
}
printf("%.15lf\n",f[a[1]][a[2]][a[3]]);
return 0;
}
本篇题解就到此结束了,如果喜欢,还请点个赞吧。