信息奥赛一本通 最低通行费 (1287) 题解
代码:
#include <bits/stdc++.h>
int n, d[128][128][2];
int dp(int r, int c) {
if(d[r][c][1]) return d[r][c][1];
if(r > 1 && c > 1) return d[r][c][1] = std::min(dp(r - 1, c), dp(r, c - 1)) + d[r][c][0];
if(r > 1) return d[r][c][1] = dp(r - 1, c) + d[r][c][0];
if(c > 1) return d[r][c][1] = dp(r, c - 1) + d[r][c][0];
return d[r][c][1] = d[r][c][0];
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n; ++j)
scanf("%d", &d[i][j][0]);
printf("%d", dp(n, n));
return 0;
}