题目描述
问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
错误思路
刚开始把问题想的太简单了,直接变成了贪心算法
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //代表 nXn的方阵
int[][] a = new int[n][n];
//构建n*n的矩阵
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
a[i][j]=sc.nextInt();
}
}
/**
*题目要求只能向右或者向下走,这个时候只需要比较向右和向下哪个更大就行了
*/
int sum = a[0][0]; //从左上角开始
int i=0,j=0;
while (j<n-1||i<n-1){
if(i==n-1)
{
sum+=a[i][++j];
continue;
}
if(j==n-1)
{
sum+=a[++i][j];
continue;
}
if(a[i][j+1]>a[i+1][j]){
sum+=a[i][++j];
}else {
sum+=a[++i][j];
}
}
System.out.println(sum);
}
}
如果是这样的矩阵,那么 用这个代码就会出错(按照刚刚的代码计算结果为,13(路径为紫色),正确答案应该为23(路径为蓝色))
解决思路
应该采用动态规划解决问题:我们可以把走到每个格子能获取到的最多金币数都列出来
这里就会出现一个问题,边界值怎么处理
我这里的处理方法是先将边界值计算出来,再计算其他的格子的值
实现代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //代表 nXn的方阵
int[][] a = new int[n][n];
//构建n*n的矩阵
for(int i=0;i<n;i++){
for (int j=0;j<n;j++){
a[i][j]=sc.nextInt();
}
}
/**
*题目要求只能向右或者向下走,这个时候只需要计算出每个格子的最大金币数就可以了
*/
//计算边界值
for(int i=1;i<n;i++){
a[0][i]+=a[0][i-1];
a[i][0]+=a[i-1][0];
}
//计算每个格子的最大数
for(int i=1;i<n;i++){
for(int j=1;j<n;j++){
a[i][j]+=Math.max(a[i-1][j],a[i][j-1]);
}
}
System.out.println(a[n-1][n-1]);
}
}
这里给推荐一个另外的处理方法:http://t.csdnimg.cn/ky6Qv