关注
定义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
查看原帖
点赞 3
相关推荐
点赞 评论 收藏
分享

点赞 评论 收藏
分享
03-28 19:11
铜陵学院 C++ 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 实习要如何选择和准备? #
49503次浏览 777人参与
# 学历or实习经历,哪个更重要 #
90263次浏览 650人参与
# 大疆求职进展汇总 #
473952次浏览 3182人参与
# 摸鱼被leader发现了怎么办 #
46335次浏览 321人参与
# 潍柴工作体验 #
22209次浏览 18人参与
# 你最满意的offer薪资是哪家公司? #
20497次浏览 120人参与
# 如果可以,你希望哪个公司来捞你 #
69527次浏览 293人参与
# 你觉得通信/硬件有必要实习吗? #
96982次浏览 893人参与
# Offer比较,求稳定还是求发展 #
44054次浏览 228人参与
# 来聊聊机械薪资天花板是哪家 #
114796次浏览 721人参与
# 硬件兄弟们 甩出你的华为奖状 #
97801次浏览 670人参与
# 找工作,行业重要还是岗位重要? #
22182次浏览 384人参与
# 金融财会交流会 #
103394次浏览 361人参与
# 机械人与华为的爱恨情仇 #
107879次浏览 923人参与
# 24届硬件人与华为的爱恨情仇 #
122462次浏览 962人参与
# 机械人怎么评价今年的华为 #
192889次浏览 1502人参与
# 运营面经 #
103594次浏览 1202人参与
# 外包能不能当跳板? #
27605次浏览 192人参与
# 实习工作,你找得还顺利吗? #
397376次浏览 5425人参与
# 国企/银行/研究所公司爆料 #
126262次浏览 742人参与