给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角。然后从右下角出发,每一步只能往上或者往左走,再回到左上角。任何一个位置的数字,只能获得一遍。返回最大路径和。

区块链毕设网qklbishe.com为您提供问题的解答

给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角。然后从右下角出发,每一步只能往上或者往左走,再回到左上角。任何一个位置的数字,只能获得一遍。返回最大路径和。

import java.util.*;  public class Main {     public static void main (String[] args) {         Scanner sc = new Scanner(System.in);         int row = sc.nextInt();         int col = sc.nextInt();         int[][] matrix = new int[row][col];         for (int i = 0; i < row; i++) {             for (int j = 0; j < col; j++) {                 matrix[i][j] = sc.nextInt();             }         }         System.out.println(cherryPick(matrix));     }      	//解题思路:让两个小人从左上走到右下,两人都只能往右或往下走,因此其中一条就表示去时的路, 	//而另一条表示回来时的路。因此当两人一旦相遇时,若该位置有樱桃,则记录为只拿了一次樱桃,否则 	//则记录为拿了两次樱桃。运用递归找到最大拿取樱桃的数量 	public static int cherryPick(int[][] m) { 		if (m == null || m[0] == null) 			return 0; 		int N = m.length; 		int M = m[0].length; 		if (N == 0 || M == 0) 			return 0; 		int[][][] dp = new int[N][M][N]; 		for (int i = 0; i < N; i++) { 			for (int j = 0; j < M; j++) { 				for (int k = 0; k < N; k++) { 					dp[i][j][k] = -1; 				} 			} 		} 		return process(m, N, M, 0, 0, 0, dp); 	} 	 	 	//注意表示两小人坐标时,之所有没有y2是因为x1 + y1 == x2 + y2, 因此y2 = x1 + y1 - x2! 	//此函是表示两小人从(x1, y1)与(x2, y2)位置出发,走到右下角的情况下,能获得的最大樱桃数是多少 	//dp[x1][y1][x2] == -1: 要么还没算过当前结果,要么已经算过了是无效解,总之都不能直接用 	public static int process(int[][] m, int N, int M, int x1, int y1, int x2, int[][][] dp) { 		//越界了返回无效值 		if (x1 == N || x2 == N || y1 == M || (x1 + y1 - x2) == M) 			return -1; 		if (dp[x1][y1][x2] != -1) 			return dp[x1][y1][x2]; 		//当两人同时走到右下角 		if (x1 == N-1 && x2 == x1) { 			dp[x1][y1][x2] = m[N-1][M-1]; 			return m[N-1][M-1]; 		} 		//找接下来能获得的最大樱桃数 		int next = -1; 		//1号小人往下走,2号小人往右走 		next = Math.max(process(m, N, M, x1 + 1, y1, x2, dp), next); 		//1号小人往下走,2号小人往下走 		next = Math.max(process(m, N, M, x1 + 1, y1, x2 + 1, dp), next); 		//1号小人往右走,2号小人往右走 		next = Math.max(process(m, N, M, x1, y1 + 1, x2, dp), next); 		//1号小人往右走,2号小人往右走 		next = Math.max(process(m, N, M, x1, y1 + 1, x2 + 1, dp), next); 		//如果下面干脆走不通,返回无效解 		if (next == -1) 			return -1; 		//两人相遇时 		if (x1 == x2) { 			dp[x1][y1][x2] = m[x1][y1] + next; 		} 		else { 			dp[x1][y1][x2] = m[x1][y1] + m[x2][x1+y1-x2] + next; 		} 		return dp[x1][y1][x2]; 	} }

14:25

以上就是关于问题给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角。然后从右下角出发,每一步只能往上或者往左走,再回到左上角。任何一个位置的数字,只能获得一遍。返回最大路径和。的答案

欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。

区块链NFT链游项目方科学家脚本开发培训

承接区块链项目定制开发

微信:btc9767

QQ :1330797917

TELEGRAM: BTCOK9

承接区块链项目定制开发


qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 给定一个矩阵matrix,先从左上角开始,每一步只能往右或者往下走,走到右下角。然后从右下角出发,每一步只能往上或者往左走,再回到左上角。任何一个位置的数字,只能获得一遍。返回最大路径和。