问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。 以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
我的思路:
就dp硬写。
代码:
package LanQiao;
import java.io.BufferedInputStream;
import java.util.Scanner;
/**
* Copyright (C), 2019-2021, Kkoo
* Author: kkoo
* Date: 2021/11/15 8:27 上午
* FileName: 拿金币
*/
public class 拿金币 {
public static void main(String[] args) {
Scanner in = new Scanner(new BufferedInputStream(System.in));
//输入n
int n = in.nextInt();
//定义N x N的方格
int[][] dp = new int[n][n];
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
//输入原始数据
dp[i][j] = in.nextInt();
}
}
for (int i = 0; i < dp.length; i++) {
for (int j = 0; j < dp[0].length; j++) {
if (i == 0 && j == 0) {
//如果是第一个格子 金币数不变
} else if (i == 0) {
//如果是第一行格子 因为在最上面 所以最大值是加上 前一列的金币
dp[i][j] += dp[i][j - 1];
} else if (j == 0) {
//如果是第一列格子 因为在最左边 所以最大值是加上 上一行的金币
dp[i][j] += dp[i - 1][j];
} else {
//因为到一个格子有两种操作
//一种是上面的格子往下走
//一种是左边的格子往右走
//所以要判断哪一种操作可以让当前的格子得到最多的金币
int max = dp[i - 1][j];
if (dp[i][j - 1] > dp[i - 1][j]) {
max = dp[i][j - 1];
}
dp[i][j] += max;
}
}
}
System.out.println(dp[n - 1][n - 1]);
}
}
作者:Kkoo
链接:https://www.pwwwp.com/
著作权归作者所有。商业转载请联系作者进行授权,非商业转载请注明出处。