定义DP[i][j] = (当前剩余生命,路径上剩余生命最小值)

找左边和右边剩余生命最大的路走就好了。下面是Java代码。

import java.util.*;

public class Main1 {
    private static int solute(int[][] matrix, int n, int m) {
        int[][][] dp = new int[n][m][2]; // 二元组,(当前剩余生命,路径上剩余生命最小值)
        dp[0][0] = new int[]{matrix[0][0], matrix[0][0]};
        for (int i = 1; i < m; i++) {
            int remain = matrix[0][i] + dp[0][i - 1][0];
            dp[0][i] = new int[]{remain, Math.min(remain, dp[0][i - 1][1])};
        }
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (j == 0 || dp[i - 1][j][0] > dp[i][j - 1][0]) {
                    int remain = matrix[i][j] + dp[i - 1][j][0];
                    dp[i][j] = new int[]{remain, Math.min(remain, dp[i - 1][j][1])};
                } else {
                    int remain = matrix[i][j] + dp[i][j - 1][0];
                    dp[i][j] = new int[]{remain, Math.min(remain, dp[i][j - 1][1])};
                }
            }
        }

        return dp[n - 1][m - 1][1] < 0 ? -dp[n - 1][m - 1][1] : 0;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][] inputs = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                inputs[i][j] = sc.nextInt();
            }
        }
        System.out.println(solute(inputs, n, m));
    }
}

输入: 3 3 -2 -3 3 -5 -10 1 10 30 -5 输出: 7