有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。
每一个数都与上面左面数比较后再得出最优的,
有内存超出的问题,可以将斜对角的数(画出图来可以看到斜对角的数已不再使用)清0。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int dp[][]=new int[N][N];
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
dp[i][j]=sc.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{
//判断向右还是向下走
long max=dp[i-1][j];
if(dp[i][j-1]>dp[i-1][j]){
max=dp[i][j-1];
}
dp[i][j]+=max;
dp[i-1][j-1]=0;
}
}
}
System.out.println(dp[N-1][N-1]);
}
}