#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define int long long using namespace std; signed main() { int R, C; cin >> R >> C; double ret = 0; double P[12][11]; double upP[12][11]; double leftP[12][11]; double rightP[12][11]; double actP[12][11]; for (int y = 0; y < R; y++) { for (int x = 0; x < C; x++) { cin >> P[y][x]; P[y][x] /= 100; upP[y][x] = 0; leftP[y][x] = 0; rightP[y][x] = 0; actP[y][x] = 0; } } int S[11][11]; for (int y = 0; y < R; y++) { for (int x = 0; x < C; x++) { cin >> S[y][x]; } } for (int y = 0; y < R; y++) { for (int x = 0; x < C-1; x++) { leftP[y][x+1] = P[y][x]; if (S[y][x] == 0) { leftP[y][x+1] *= 1; } else if (S[y][x] == 1) { leftP[y][x+1] *= 1 - (1-leftP[y][x])*(1-upP[y][x]); } else if (S[y][x] == 2) { leftP[y][x+1] *= leftP[y][x]*upP[y][x]; } else { leftP[y][x+1] *= 0; } } for (int x = C-1; x > 0; x--) { rightP[y][x-1] = P[y][x]; if (S[y][x] == 0) { rightP[y][x-1] *= 1; } else if (S[y][x] == 1) { rightP[y][x-1] *= 1 - (1-rightP[y][x])*(1-upP[y][x]); } else if (S[y][x] == 2) { rightP[y][x-1] *= rightP[y][x]*upP[y][x]; } else { rightP[y][x-1] *= 0; } } for (int x = 0; x < C; x++) { actP[y][x] = P[y][x]; if (S[y][x] == 0) { actP[y][x] *= 1; } else if (S[y][x] == 1) { actP[y][x] *= 1 - (1-leftP[y][x])*(1-rightP[y][x])*(1-upP[y][x]); } else if (S[y][x] == 2) { actP[y][x] *= leftP[y][x] * rightP[y][x] * upP[y][x] + leftP[y][x] * rightP[y][x] * (1-upP[y][x]) + leftP[y][x] * (1-rightP[y][x]) * upP[y][x] + (1-leftP[y][x]) * rightP[y][x] * upP[y][x]; } else if (S[y][x] == 3) { actP[y][x] *= leftP[y][x] * rightP[y][x] * upP[y][x]; } else { actP[y][x] *= 0; } ret += actP[y][x]; upP[y+1][x] = actP[y][x]; } } printf("%.15f\n", ret); return 0; }