import sys

data = sys.stdin.read().strip().split()
it = iter(data)
H = int(next(it))
W = int(next(it))
K = int(next(it))

# I, E, P分别为图像矩阵、能量矩阵和策略矩阵
I = [[0] * W for _ in range(H)]
E = [[0] * W for _ in range(H)]
P = [[0] * K for _ in range(K)]

# 读取图像矩阵和策略矩阵
for i in range(H):
    for j in range(W):
        I[i][j] = float(next(it))

for u in range(K):
    for v in range(K):
        P[u][v] = float(next(it))

# 计算能量矩阵
for i in range(H):
    for j in range(W):
        r = K // 2
        for u in range(K):
            for v in range(K):
                row = i + u - r
                col = j + v - r
                if 0 <= row < H and 0 <= col < W:
                    E[i][j] += I[row][col] * P[u][v]

# 定义每一列的最优状态
dp = [0] * H

for j in range(W):
    if j == 0:
        for i in range(H):
            dp[i] = E[i][j]
    else:
        maximum = 0
		# 每个位置的最大能量和有三种情况,与左上角最优值相加,与左侧最优值相加,与左下角最优值相加
        for i in range(H):
            if i - 1 >= 0:
                maximum = max(maximum, dp[i - 1] + E[i][j])
            maximum = max(maximum, dp[i] + E[i][j])
            if i + 1 < H:
                maximum = max(maximum, dp[i + 1] + E[i][j])
        dp[i] = maximum

ans = max(dp)
print(f"{ans:.1f}")