/*
* 有一个N x N的方格,每一个格子都有一些金币,
* 只要站在格子里就能拿到里面的金币。
* 你站在最左上角的格子里,
* 每次可以从一个格子走到它右边或下边的格子里。
* 请问如何走才能拿到最多的金币。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] jinBi = new int[n][n];
for(int i = 0;i < n;i++) {
for(int j = 0;j < n;j++) {
jinBi[i][j] = in.nextInt();
}
}
// System.out.println(jinBi.length);
System.out.println(naJinBi(jinBi));
}
public static int naJinBi(int[][] jinBi) {
int[][] dp = new int[jinBi.length][jinBi.length];
dp[0][0] = jinBi[0][0];
int sum = dp[0][0]; //用于初始化dp数组的第0行和第0列
// 初始化dp[0][j]这一行
for(int i = 1;i < jinBi.length;i++) {
sum += jinBi[0][i];
dp[0][i] = sum;
}
// 初始化dp[i][0]这一列
sum = dp[0][0];
for(int i = 1;i < jinBi.length;i++) {
sum += jinBi[i][0];
dp[i][0] = sum;
}
// 填充 dp 数组,取得每一步的最大获得金币数
for(int i = 1;i < jinBi.length;i++) {
for(int j = 1;j < jinBi.length;j ++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]) + jinBi[i][j];
}
}
return dp[jinBi.length - 1][jinBi.length - 1];
}
}
【蓝桥杯】拿金币(Java)
于 2022-02-11 17:31:54 首次发布
该博客介绍了一个使用动态规划解决的算法问题:在一个NxN的网格中,从左上角开始,每次只能向右或向下移动,目标是收集最多的金币。博主通过创建二维数组dp来存储每个位置的最大金币数,并初始化边界条件,然后逐步填充dp数组以找到最优路径。最终返回dp数组的右下角元素,即最大金币数。
1万+

被折叠的 条评论
为什么被折叠?



