思路:
(1)注意到时间要求为2N - 1,等价于只能往右或者往下走。
(2)于是用f[i][j]描述走到(i,j)的最小代价,由于只能从左或者上到达,故取最小即可。
(3)初始化:
- 从(1,1)开始,预留边界。
- 为防止被边界更新,于是将边界都初始化为0x3f3f3f3f,对于f[1][1]特判即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 110,INF = -0x3f3f3f3f;
int f[N][N];
int a[N][N];
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
cin >> a[i][j];
memset(f,0x3f,sizeof f);
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
if(i == 1 && j == 1) f[i][j] = a[i][j];
else f[i][j] = min(f[i - 1][j],f[i][j - 1]) + a[i][j];
cout << f[n][n] << endl;
return 0;
}