算法如山行则将至
题目描述
Alice和Bob进行游戏,翻转硬币使正面朝上数量最多。
思考与重做
王梓豪的同题记录 · 1 条
- 王梓豪 · 2026-08-23本次记录最后更新 2026.9.17
完成结果:未记录已结束复习安排
这个题目非常之阴,我想到了dp,但是没想到是二维dp,二项分布的期望结果不能用来作为下一次二项分布的原始数据,这是高中的结论,要记住,多次的二项分布一定要把每种情况给出来
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
int n, m, k;
cin >> n >> m >> k;
vector<double> p(k + 1);
p[0] = pow(0.5, k);
for (int j = 1; j <= k; ++j) {
p[j] = p[j - 1] * (k - j + 1) / j;
}
/*
dp[turn][zheng]表示:
当前已经有zheng枚硬币正面朝上
还可以进行turn次操作时
最终能够获得的正面硬币数量的最大期望
dp[m,0]为ans
*/
vector<vector<double>> dp(m+1,vector<double>(n+1,0.0));
for (int zheng=0; zheng<=n;++zheng) {
dp[0][zheng] = zheng;
}
for (int turn=1;turn<=m;++turn) {
for (int zheng=0; zheng<=n;++zheng) {
int szheng=max(0,k-(n-zheng));
int dzheng=zheng - szheng;
for (int j=0;j<=k;++j) {
int nzheng=dzheng+j;
dp[turn][zheng]+=p[j]*dp[turn - 1][nzheng];
}
}
}
cout<<fixed<<setprecision(3)<<dp[m][0]<<'\n';
}
return 0;
}