简单题。
首先 k m o d 2 = 1 k\bmod 2=1 kmod2=1 的时候显然无解。
设 f [ p ] [ i ] [ j ] f[p][i][j] f[p][i][j] 表示走了 p p p 步,当前在 ( i , j ) (i,j) (i,j),最小花费是多少。
由于数据范围很小,所以直接暴力转移即可。
时间复杂度 O ( n m k ) \mathcal O(nmk) O(nmk)。
#include <bits/stdc++.h>
using namespace std;
int r[510][510], c[510][510];
int f[22][510][510];
signed main()
{
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++)
for (int j = 1; j < m; j++)
cin >> r[i][j];
for (int i = 1; i < n; i++)
for (int j = 1; j <= m; j++)
cin >> c[i][j];
int p = k / 2;
for (int _ = 1; _ <= p; _++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
f[_][i][j] = 1e9;
if (k & 1)
{
for (int i = 1; i <= n; i++, cout << '\n')
for (int j = 1; j <= m; j++)
cout << "-1 ";
}
else
{
for (int _ = 1; _ <= p; _++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
{
if (i > 1)
f[_][i - 1][j] = min(f[_][i - 1][j], f[_ - 1][i][j] + c[i - 1][j]);
if (i < n)
f[_][i + 1][j] = min(f[_][i + 1][j], f[_ - 1][i][j] + c[i][j]);
if (j > 1)
f[_][i][j - 1] = min(f[_][i][j - 1], f[_ - 1][i][j] + r[i][j - 1]);
if (j < m)
f[_][i][j + 1] = min(f[_][i][j + 1], f[_ - 1][i][j] + r[i][j]);
}
for (int i = 1; i <= n; i++, cout << '\n')
for (int j = 1; j <= m; j++)
cout << f[p][i][j] * 2 << ' ';
}
return 0;
}