在n*n的方格阵中,从左上角出发,每次只能往正下方或右边走,找出一种路线方案,使得所经历方格中数字和最大,输出这个值。

在n*n的方格阵中,从左上角出发,每次只能往正下方或右边走,找出一种路线方案,使得所经历方格中数字和最大,输出这个值。

(下图n=5)

 

0537539
551019238
655882899
80145068
89510410

 

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];
   }
} 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最强玩者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值