简单的动态规划问题:
- 确定dp数组的含义:dp[i][j] 表示到达[i, j] 位置的概率
- 初始化:对于第一行和第一列要做特别的初始化处理。因为在边界只有一种选择
- 状态转移方程:
- 确定递推方向:从上到下,从左往右
#include <iostream>
#include <vector>
using namespace std;
double A2B(vector<vector<double>>& dp) {
// dp数组的初始化
dp[0][0] = 1;
int n = dp.size(), m = dp[0].size();
for (int i = 1; i < n; i++) {
if (dp[i][0] == -1) dp[i][0] = 0;
else dp[i][0] = dp[i - 1][0] / 2;
}
for (int j = 1; j < m; j++) {
if (dp[0][j] == -1) dp[0][j] = 0;
else dp[0][j] = dp[0][j - 1] / 2;
}
// 状态转移方程
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
if (dp[i][j] == -1) dp[i][j] = 0;
else {
dp[i][j] += i == n - 1 ? dp[i][j - 1] : dp[i][j - 1] / 2;
dp[i][j] += j == m - 1 ? dp[i - 1][j] : dp[i - 1][j] / 2;
}
}
}
return dp[n - 1][m - 1];
}
int main() {
int n, m, k;
while (cin >> n >> m) {
cin >> k;
vector<vector<double>> dp(n, vector<double>(m, 0));
for (int i = 0; i < k; i++) {
int x, y;
cin >> x >> y;
dp[x - 1][y - 1] = -1.0; // -1 表示有蘑菇
}
// 可以排除只有一行或者一列,但没有蘑菇的特殊情况
if(k == 0) cout << "1.00" << endl;
else {
double ans = A2B(dp);
printf("%.2lf\n", ans);
}
}
}

京公网安备 11010502036488号