本题中,每个格子的答案可以影响右上、右、右下 3 个格子的答案,显然可以推出状态转移方程为:
$$
dp[i][j] = min(dp[i - 1][j - 1], dp[i][j - 1], dp[i+1][j-1])
$$
推出状态转移方程后,本题还需要注意的细节有:
dp
数组是一列一列地迭代出来的,所以循环时应该先循环列数再循环行数;- 初始化时,需要注意应该同时初始化第
0
列为INF
,如果不初始化第0
列为INF
,进行第一列的递推时应该只能考虑起点所影响到的 3 个格子; - 不能走的点可以设置伤害为
INF
,则必然不会计入答案中; - 多个
INF
相加可能会溢出,注意考虑计算顺序; - 本题的输入为字母数字混合式二维数组,注意到数字范围为 $0\sim 9$,这里可以使用
scanf("%1s", str);
的方式进行输入。这种输入方式为每次输入一个长度为 1 的字符串,而当输入字符串时会自动过滤空白字符,从而达到每次只输入一个非空白字符的目的。
代码:
1 |
|