问题描述
有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
输入格式
第一行输入一个正整数n。
以下n行描述该方格。金币数保证是不超过1000的正整数。
输出格式
最多能拿金币数量。
样例输入
3
1 3 3
2 2 2
3 1 2
样例输出
11
数据规模和约定
n<=1000
思路:dp算法,每一次比较自身加上面或右面的最大值赋值给自身,最后输出dp[n][n];但是用Java的Scanner输入容易超内存,改成BufferedReader即Java专门的io流便会减少原输入造成的内存的一半空间复杂度
代码及相应截图如下:
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader sc=new BufferedReader(new InputStreamReader(System.in));
String[]s=sc.readLine().trim().split(" ");
int n=Integer.parseInt(s[0]);
int [][]money=new int[n][n];
int k=0;
for(int i=0;i<n;i++) {
String[]sh=sc.readLine().trim().split(" ");
for(int j=0;j<n;j++)
{money[i][j]=Integer.parseInt(sh[j]);
//k++;
}
}
int [][]dp=new int [n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1])+money[i-1][j-1];
System.out.print(dp[n][n]);
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int [][]dp=new int[n+1][n+1];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dp[i][j]=sc.nextInt();
sc.close();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
//判断右方数值和上方数值那个大,便加那个
dp[i][j]=Math.max(dp[i-1][j], dp[i][j-1])+dp[i][j];
System.out.print(dp[n][n]);
}
}