Description:
七颗星,第
i
i
课星用第j个宝石有的概率成功,失败将为
g[i][j]
g
[
i
]
[
j
]
颗星。第
j
j
个宝石化费,求最小期望化费。
Solution:
由于期望的线性性质,我们可以得出dp方程,转化一下即可得出
dp[i]=min(dp[i],((dp[i−1]+c[j])∗p[i][j]−dp[i−1−g[i][j]]∗(1.0−p[i][j]))/p[i][j])
d
p
[
i
]
=
m
i
n
(
d
p
[
i
]
,
(
(
d
p
[
i
−
1
]
+
c
[
j
]
)
∗
p
[
i
]
[
j
]
−
d
p
[
i
−
1
−
g
[
i
]
[
j
]
]
∗
(
1.0
−
p
[
i
]
[
j
]
)
)
/
p
[
i
]
[
j
]
)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 105;
int n;
int g[8][N];
double c[N], p[8][N], dp[8];
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%lf", &c[i]);
}
for(int i = 1; i <= 7; ++i) {
int flag = 0;
for(int j = 1; j <= n; ++j) {
scanf("%lf", &p[i][j]);
flag |= (fabs(p[i][j]) > 1e-8);
}
if(!flag) {
return puts("-1"), 0;
}
}
for(int i = 1; i <= 7; ++i) {
for(int j = 1; j <= n; ++j) {
scanf("%d", &g[i][j]);
}
}
for(int i = 1; i <= 7; ++i) {
dp[i] = 1e18;
for(int j = 1; j <= n; ++j) {
if(p[i][j]) {
dp[i] = min(dp[i], ((dp[i - 1] + c[j]) * p[i][j] - dp[i - 1 - g[i][j]] * (1.0 - p[i][j])) / p[i][j]);
}
}
}
printf("%.10f\n", dp[7]);
return 0;
}