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


 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
n行m列的方格的第一个格子。小蓝每次可以向右或向下移动一格,直到方格图的右下角,即第n行m列的格子。在移动过程,小蓝要尽可能多地经过方格数字,并且不能重复经过同一个格子。小蓝想知道,他最多能够经过多少个数字格子。 解题思路: 这是一个典型的动态规划问题。用dp[i][j]表示小蓝从(1,1)到(i,j)所经过的最大数字个数。则,小蓝从(i,j)只能从上方和左方两个方向过来。所以状态转移方程为: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + (方格(i,j)数字) 具体的实现算法为: 1. 首先,创建一个大小为n*m的二维数组dp,并将dp每个元素初始化为0。 2. 从左上角开始,依次计算dp[i][j]。 3. 对于第一行和第一列,因为它们只能从上方或左方过来,所以只需要计算相邻格子的dp,并加上当前格子数字即可。即dp[i][j] = dp[i-1][j] + (方格(i,j)数字) 或者 dp[i][j] = dp[i][j-1] + (方格(i,j)数字)。 4. 对于其他格子,需要比较从上方和左方过来的最大dp,并加上当前格子数字。即dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + (方格(i,j)数字)。 5. 最后返回dp[n][m]即可得到结果,即小蓝经过的最多数字个数。 例如,对于一个3行4列的方格图: 1 3 5 6 2 8 3 4 6 1 9 2 经过计算得到dp数组为: 1 4 9 15 3 12 15 19 9 13 24 26 dp[3][4]的为26,即小蓝最多能经过26个数字格子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

最强玩者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值