倒序
// a, b 下标均从 1 开始
for (int i = A + 1; i>=1; --i)
for (int j = B + 1; j>=1; --j) {
if (i > A && j > B) continue;
if ((i + j) & 1) {
if (i > A)
f[i][j] = f[i][j + 1];
else if (j > B)
f[i][j] = f[i + 1][j];
else
f[i][j] = std::min(f[i + 1][j], f[i][j + 1]);
} else {
if (i > A)
f[i][j] = f[i][j + 1] + b[j];
else if (j > B)
f[i][j] = f[i + 1][j] + a[i];
else
f[i][j] = std::max(f[i + 1][j] + a[i], f[i][j + 1] + b[j]);
}
}
return f[1][1];
}
正序
// a, b 下标均从 1 开始
for (int i = 0; i<=n; i++)
for (int j = 0; j<=m; j++) {
if (i==0&&j==0) continue;
if ((i + j) & 1) {
if (i<1)
f[i][j] = f[i][j - 1];
else if (j<1)
f[i][j] = f[i - 1][j];
else
f[i][j] = std::min(f[i - 1][j], f[i][j - 1]);
} else {
if (i <1)
f[i][j] = f[i][j - 1] + b[j];
else if (j <1)
f[i][j] = f[i -1 ][j] + a[i];
else
f[i][j] = std::max(f[i - 1][j] + a[i], f[i][j- 1] + b[j]);
}
}
return f[n][m];
}