在n*n的方格阵中,从左上角出发,每次只能往正下方或右边走,找出一种路线方案,使得所经历方格中数字和最大,输出这个值。
(下图n=5)
0 | 5 | 37 | 53 | 9 |
55 | 10 | 19 | 23 | 8 |
65 | 58 | 82 | 89 | 9 |
8 | 0 | 14 | 50 | 68 |
89 | 5 | 10 | 41 | 0 |
Input Description
第1行:一个整数n (1<=n<=1000)
第2-n+1行:每行n个非负整数 (整型范围)
Output Description
一行:一个整数
Sample Input
5
0 5 37 53 9
55 10 19 23 8
65 58 82 89 9
8 0 14 50 68
89 5 10 41 0
Sample Output
467
import java.util.Scanner;
class Main{
public static void main(String [] args){
Scanner in=new Scanner(System.in);
int N=Integer.parseInt(in.nextLine());
int [][]arr=new int[N][N];
for(int i=0;i<N;i++) {
String string=in.nextLine();
for(int j=0;j<N;j++) {
arr[i][j]=Integer.parseInt(string.split("\t")[j]);
}
}
System.out.println(fun(arr, N));
in.close();
}
public static int fun(int [][]arr,int N) {
int [][]dp=new int[N][N];
int sum1=0,sum2=0;
for(int i=0;i<N;i++) {
sum1+=arr[0][i];
dp[0][i]=sum1;
sum2+=arr[i][0];
dp[i][0]=sum2;
}
for(int i=1;i<N;i++) {
for(int j=1;j<N;j++) {
dp[i][j]=((dp[i-1][j]>dp[i][j-1])?dp[i-1][j]:dp[i][j-1])+arr[i][j];
}
}
return dp[N-1][N-1];
}
}