Description
牛客网 2018校招真题 抽牌
Solving Ideas
State
dp[i][j]
:从a[i]
到a[j]
这些数小明的得分期望
Initial State
dp[i][i] = a[i]
dp[i][i+1] = p * a[i] + (1-p) * a[i+1] (i < n - 1)
State Transition
d
p
[
i
]
[
j
]
=
p
∗
(
q
∗
d
p
[
i
+
2
]
[
j
]
+
(
1
−
q
)
∗
d
p
[
i
+
1
]
[
j
−
1
]
+
a
[
i
]
)
+
(
1
−
p
)
∗
(
q
∗
d
p
[
i
+
1
]
[
j
−
1
]
+
(
1
−
q
)
∗
d
p
[
i
]
[
j
−
2
]
+
a
[
j
]
)
;
dp[i][j] = p * (q * dp[i + 2][j] + (1 - q) * dp[i + 1][j - 1] + a[i]) + (1 - p) * (q * dp[i + 1][j - 1] + (1 - q) * dp[i][j - 2] + a[j]);
dp[i][j]=p∗(q∗dp[i+2][j]+(1−q)∗dp[i+1][j−1]+a[i])+(1−p)∗(q∗dp[i+1][j−1]+(1−q)∗dp[i][j−2]+a[j]);
Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] strs = br.readLine().split(" ");
int n = Integer.parseInt(strs[0]);
int P = Integer.parseInt(strs[1]), Q = Integer.parseInt(strs[2]);
double p = P / 100.0, q = Q / 100.0;
int[] a = new int[n];
strs = br.readLine().split(" ");
for (int i = 0; i < n; i++) {
a[i] = Integer.parseInt(strs[i]);
}
double[][] dp = new double[n][n];
for (int i = 0; i < n; i++) {
dp[i][i] = a[i];
if (i < n - 1) {
dp[i][i + 1] = p * a[i] + (1 - p) * a[i + 1];
}
}
for (int i = n - 3; i >= 0; i--) {
for (int j = i + 2; j < n; j++) {
dp[i][j] = p * (q * dp[i + 2][j] + (1 - q) * dp[i + 1][j - 1] + a[i])
+ (1 - p) * (q * dp[i + 1][j - 1] + (1 - q) * dp[i][j - 2] + a[j]);
}
}
System.out.printf("%.3f\n", dp[0][n-1]);
}
}