[AcWing 1018] 最低通行费


点击查看代码
#include<iostream>
using namespace std;
const int N = 110;
const int INF = 1e9;
int n;
int s[N][N], f[N][N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
cin >> s[i][j];
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++) {
if (i == 1 && j == 1) f[i][j] = s[i][j];
else if (i == 1) f[i][j] = f[i][j - 1] + s[i][j];
else if (j == 1) f[i][j] = f[i - 1][j] + s[i][j];
else f[i][j] = min(f[i - 1][j], f[i][j - 1]) + s[i][j];
}
cout << f[n][n] << endl;
return 0;
}
- 状态表示
\(f[i][j]\) 表示从 \((1,1)\) 到 \((i,j)\) 的所有路线的最小值 - 状态计算
① \(f[1][1] = s[1][1]\)
② 第一行,\(i = 1\),\(f[i][j] = f[i][j - 1] + s[i][j]\)
③ 第一列,\(j = 1\),\(f[i][j] = f[i - 1][j] + s[i][j]\)
④ 其他情况,$f[i][j] = min(f[i - 1][j], f[i][j - 1]) + s[i][j] $

浙公网安备 33010602011771号