简单
2025-08-26 21:28:07
发布于:北京
5阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <cmath>
#include <iomanip>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// 边界情况:只有1人时必赢
if (n == 1) {
cout << fixed << setprecision(9) << 1.0 << endl;
return 0;
}
// 初始化k=1的情况:prev_dp[0]对应dp[1][1]
vector<double> prev_dp(1, 1.0);
// 从k=2开始递推到k=n
for (int k = 2; k <= n; ++k) {
// 计算sum_val = sum_{i=1 to k-1} (0.5)^((k-1)-i) * dp[k-1][i]
double sum_val = 0.0;
for (int i = 1; i < k; ++i) { // i是1-based位置
int t = (k - 1) - i; // 指数
sum_val += pow(0.5, t) * prev_dp[i - 1];
}
// 计算dp[k][1](对应curr_dp[0])
double denominator = 6 * (1 - 1 / pow(2, k));
double curr_dp0 = (1 + sum_val) / denominator;
vector<double> curr_dp;
curr_dp.push_back(curr_dp0);
// 计算dp[k][2]到dp[k][k]
for (int p = 2; p <= k; ++p) {
double term1 = 0.5 * curr_dp[p - 2]; // dp[k][p-1]
double term2 = (1.0 / 3) * prev_dp[p - 2]; // dp[k-1][p-1]
curr_dp.push_back(term1 + term2);
}
// 更新prev_dp为当前k的结果
prev_dp = move(curr_dp);
}
// 输出结果,精确到小数点后9位
cout << fixed << setprecision(9) << prev_dp[m - 1] << endl;
return 0;
}
这里空空如也
有帮助,赞一个