$\LARGE\color{orange}{刷题日记(算法提高课)}$
状态转移方程为 $f[i][j]\ =\ min(f[i-1][j], f[i][j-1])\ +\ w[i][j]$ ,但由于我们初始化的数组是全局的,因此需要对边界进行讨论
我们数组下标从 1 开始,那么下标为 1 的值就不能参与转移,也就是需要对第一行和第一列做特判
这里有一个问题是,会导致 $f[1][1]$ 的值无法被计算,因此这个数需要特别赋值
除此之外,由于求的是最小值,因此需要对 $f[i][j]$ 设定一个极大值作为初始值
完整代码如下:
#include <iostream>
using namespace std;
const int N = 110, INF = 0x3f3f3f3f;
int f[N][N], w[N][N];
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> w[i][j];
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
{
f[i][j] = INF;
if(i == 1 && j == 1) f[i][j] = w[i][j];//对第一个格子进行初始化
else
{
if(i > 1) f[i][j] = min(f[i][j], f[i - 1][j] + w[i][j]);
if(j > 1) f[i][j] = min(f[i][j], f[i][j - 1] + w[i][j]);
}
}
cout << f[n][n] << endl;
return 0;
}