如何修改Java代码实现数字三角形中非质数的最大路径和计算
修改Java代码实现仅经过非质数的数字三角形最大路径和
核心思路
要实现需求,需要在动态规划过程中加入质数过滤:
- 实现准确的质数判断函数,注意1不是质数、2是唯一偶质数等特殊情况。
- 动态规划时,若当前数字是质数,直接标记为无效路径(用负无穷表示);若非质数,则仅从下方相邻的有效路径(非质数对应的路径和)中选择最大值累加。
修改后的完整代码
import java.nio.file.Files; import java.nio.file.Paths; import java.util.stream.Stream; public class MaxPathSum { // 判断是否为质数的工具方法 private static boolean isPrime(int num) { if (num <= 1) return false; if (num == 2) return true; if (num % 2 == 0) return false; // 检查从3到平方根的奇数 for (int i = 3; i <= Math.sqrt(num); i += 2) { if (num % i == 0) return false; } return true; } public static void main(String[] args) throws Exception { int[][] data = Files.lines(Paths.get("src/main/triangle.txt")) .map(s -> Stream(s.trim().split("\\s+")) .mapToInt(Integer::parseInt) .toArray()) .toArray(int[][]::new); // 先处理最后一行:质数标记为负无穷(无法作为终点) int lastRow = data.length - 1; for (int c = 0; c < data[lastRow].length; c++) { if (isPrime(data[lastRow][c])) { data[lastRow][c] = Integer.MIN_VALUE; } } // 从倒数第二行向上动态规划计算 for (int r = data.length - 2; r >= 0; r--) { for (int c = 0; c < data[r].length; c++) { // 当前数字是质数,直接标记为无效路径 if (isPrime(data[r][c])) { data[r][c] = Integer.MIN_VALUE; continue; } // 获取下方两个相邻位置的路径和,处理无效路径的情况 int left = data[r + 1][c]; int right = data[r + 1][c + 1]; int maxNext = Math.max(left, right); // 如果下方没有有效路径,当前位置也标记为无效 if (maxNext == Integer.MIN_VALUE) { data[r][c] = Integer.MIN_VALUE; } else { data[r][c] += maxNext; } } } // 输出结果,若顶部是质数或无有效路径会输出Integer.MIN_VALUE,可根据需求添加判断 System.out.println(data[0][0]); } }
关键修改点说明
- 质数判断方法:
isPrime函数覆盖了所有边界情况(小于等于1的数、2、偶数、奇数),确保质数判断准确。 - 最后一行初始化:将最后一行中的质数设为
Integer.MIN_VALUE,表示这些位置不能作为有效终点。 - 动态规划逻辑调整:
- 若当前数字是质数,直接标记为无效路径,跳过后续计算。
- 若非质数,仅从下方两个相邻位置的有效路径中取最大值累加;如果下方两个位置都是无效路径,当前位置也标记为无效。
- 示例验证:用你提供的示例数据运行代码,会得到预期的结果24。
内容的提问来源于stack exchange,提问作者user19370734
相关产品推荐
相关产品推荐

