【奇安信2020秋笔试2】
题目:
有一个m*n 的网格,在每个格子上有一个非0 整数。 你每次只能向下或者向右移动一格,求你从左上角移动到最右下角,路径上数字和的最大值。
实例1:
[
[2,3,1],
[2,5,3],
[4,2,1]
]
输出:14
解释:2->3->5->3->1 路径和的最大值
思路:动态规划
1.建立动态数组。 本题的动态数组是二维的,数组值的含义为从左上角走到当前位置上的最大的路径和。也就是说每走一步都能确定当前位置上的最大和,并将这个位置上的最大和保存在动态数组中。
2.推导递推公式。 根据题意可以推断每个位置上的最大和是由上和左两个方向上的最大和与本位置值相加得到的,然后保存结果更大的和。此外,本题递推公式还需要判断边界条件,做出适当改变。
3.动态数组初始化。 本题动态数组初始化为0即可。
4.确定遍历顺序。 根据题意可知,从左上角出发,最终取右下角位置上的最大和,因此遍历顺序为左上到右下顺序遍历。
5.举例判断。 可以自己做一些测试与结果相比看看是否一致。
public class maxPathSum {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int[][] path = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
path[i][j] = scanner.nextInt();
}
}
System.out.println(maxSum(path,m,n));
}
//动态规划
private static int maxSum(int[][] path, int m, int n){
int[][] dp = new int[m][n]; //定义二维的状态数组
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
//状态转移
if(i == 0 && j == 0) dp[i][j] = path[0][0];
if(i == 0 && j != 0) dp[i][j] = dp[i][j-1] + path[i][j];
if(i != 0 && j == 0) dp[i][j] = dp[i-1][j] + path[i][j];
if(i > 0 && j > 0) dp[i][j] = Math.max(dp[i][j-1],dp[i-1][j]) + path[i][j];
}
}
return dp[m-1][n-1];
}
}
相似题目:
leetcode 64. 最小路径和
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。