原网址:链接: https://www.lanqiao.cn/problems/553/learning/?page=1&first_category_id=1&sort=students_count
仔细阅读题目我们会发现,如果我们以*为起点的话,那么我们就有以下的几种跳跃方案,如下图
那么如果我们就可以根据这个图逆推出共有哪些点可以跳到*点,如下
这时我们可以使用动态规划,先将地图数组导入dp数组内,然后将可以跳到*点的dp数组内的数字遍历一遍求出其中的最小值,并与map中的值相加,即可求出跳到该点所花费的最小权值。
import java.util.Scanner;
public class jump {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int m = scan.nextInt();
int map[][] = new int[n][m];
int dp[][] = new int[n][m];
for(int i = 0;i<n;i++){
for(int j =0;j<m;j++){
map[i][j] = scan.nextInt();
dp[i][j] = map[i][j];
}
}
for(int i =0;i<n;i++){
for(int j =0;j<m;j++){
if(i==0&&j==0){
continue;
}
int max = Integer.MIN_VALUE;
int in = 3;
for(int q = i;q>-1&&q>=i-3;q--) {
for(int w = j;w>-1&&w>=j-in;w--) {
if(q==i&&w==j){
continue;
}
if(dp[q][w]>max) {
max = dp[q][w];
}
in--;//使用in参数,控制列的遍历次数
}
}
dp[i][j] = max + map[i][j];
}
}
System.out.println(dp[n-1][m-1]);
scan.close();
}
}
将上述代码运行,得到如下图所示的dp数组
(完)
周总结:
本题是我第一次自己写出的动态规划算法题,自信心提升不少,但算法之路任重而道远,切不可骄傲急躁。
现在阶段的任务比较繁重,阶段任务完成之前可能不会分配大块大块的时间练习算法了。