二刷提高课,题解目录在这里— 提高课的题解目录
此题和上一题其实是一样的,只是表述更加隐晦
当我们在走网格的时候若想从起点到终点,最短距离就是2*N-重复的交点
即是2n-1,所以我们若将步数控制在2n-1上,那我们的走网格的路径其实就确定了
即每一步只能选择走右或者下,那么就和上一题一样了
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int a[N][N],f[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[1][1]=a[1][1];
else f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j];
}
cout<<f[n][n];
}
如果不加if(i==1&&j==1)f[1][1]=a[1][1];如果i=1,j=1时用f[i][j]=min(f[i-1][j],f[i][j-1])+a[i][j]也能得到f[1][1]=a[1][1]为什么不对呢?
不可以哦,这里初始化并不是0
当i=1,j=1时,f[i-1][j]和f[i][j-1]都是0啊,那f[1][1]=a[1][1]就成立了吧
memset(f,0x3f,sizeof f);注意自己的初始化