• 最大路径和



    前言

    链接:https://www.nowcoder.com/questionTerminal/8ecfe02124674e908b2aae65aad4efdf
    来源:牛客网

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

    输入描述:
    第一行输入两个整数M和N,M,N<=200
    接下来M行,每行N个整数,表示矩阵中元素

    输出描述:
    输出一个整数,表示最大路径和

    解题思路

    两个人A, B都从左下角走到右下角,都只能向下或者向右走,但是A跟B能做出不同的选择
    如果,某一时刻,AB进入相同的一 个格子,A和B只获得一份
    A走到之后,就认为B就是回来的路径

    A来到了a行b列, B来到了c行d列,如果它们跳进不同的格子里。
    只获得一个的情况下,问你a跟b获得整体的最大。

    在这里插入图片描述

    如果某一个位置A也来过,B也来过,AB-定是同时来的,而不会分先后
    因为AB同步走

    可以省掉一个变量d,可以根据abc来推出d

    代码

    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int N = sc.nextInt();
    		int M = sc.nextInt();
    		int[][] matrix = new int[N][M];
    		for (int i = 0; i < N; i++) {
    			for (int j = 0; j < M; j++) {
    				matrix[i][j] = sc.nextInt();
    			}
    		}
    		int ans = cherryPickup(matrix);
    		System.out.println(ans);
    		sc.close();
    	}
    	
    	public static int cherryPickup(int[][] grid) {
    		int N = grid.length;
    		int M = grid[0].length;
    		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] = Integer.MIN_VALUE;
    				}
    			}
    		}
    		int ans = process(grid, 0, 0, 0, dp);
    		return ans < 0 ? 0 : ans;
    	}
    
    	public static int process(int[][] grid, int x1, int y1, int x2, int[][][] dp) {
    		if (x1 == grid.length || y1 == grid[0].length || x2 == grid.length || x1 + y1 - x2 == grid[0].length) {
    			return Integer.MIN_VALUE;
    		}
    		if (dp[x1][y1][x2] != Integer.MIN_VALUE) {
    			return dp[x1][y1][x2];
    		}
    		if (x1 == grid.length - 1 && y1 == grid[0].length - 1) {
    			dp[x1][y1][x2] = grid[x1][y1];
    			return dp[x1][y1][x2];
    		}
    		int next = Integer.MIN_VALUE;
    		next = Math.max(next, process(grid, x1 + 1, y1, x2 + 1, dp));
    		next = Math.max(next, process(grid, x1 + 1, y1, x2, dp));
    		next = Math.max(next, process(grid, x1, y1 + 1, x2, dp));
    		next = Math.max(next, process(grid, x1, y1 + 1, x2 + 1, dp));
    		if (grid[x1][y1] == -1 || grid[x2][x1 + y1 - x2] == -1 || next == -1) {
    			dp[x1][y1][x2] = -1;
    			return dp[x1][y1][x2];
    		}
    		if (x1 == x2) {
    			dp[x1][y1][x2] = grid[x1][y1] + next;
    			return dp[x1][y1][x2];
    		}
    		dp[x1][y1][x2] = grid[x1][y1] + grid[x2][x1 + y1 - x2] + next;
    		return dp[x1][y1][x2];
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
  • 相关阅读:
    一个Windows远程工具,小巧但实用,支持RDP、SSH、SFTP、FTP等多种协议
    第一季:5递归与迭代【Java面试题】
    手把手教你:轻松打造沉浸感十足的动态漫反射全局光照
    Groovy之面向对象
    LeetCode 周赛 346(2023/05/21)仅 68 人 AK 的最短路问题
    【MySql】mysql之进阶查询语句
    SpringCloud-gateway网关入门使用
    搭建Lua与C/C++交互的环境
    金九银十面试跳槽季:且看程序员如何秒变 offer 收割小能手
    【虹科ELPRO - EMS系统】实现苏州某医药仓库温湿度自动监测 - 100% GxP合规(下)
  • 原文地址:https://blog.csdn.net/xiaolu567/article/details/126078445