IT评测·应用市场-qidao123.com

标题: 蓝桥杯 Java B 组之总结与模拟题训练 [打印本页]

作者: 知者何南    时间: 2025-2-19 16:46
标题: 蓝桥杯 Java B 组之总结与模拟题训练
 蓝桥杯 Java B 组 - 第七天:周总结与模拟题训练

Day 7:周总结与模拟题训练

在这一周的学习中,我们已经打仗了动态规划的基本概念和常见应用。今天,我们将通过刷一些蓝桥杯的模拟题,来认识并巩固所学的知识,特殊是动态规划的问题。

 一、模拟题:Fibonacci数列求余

标题描述:

给定正整数 n,求斐波那契数列的第 n 项,并计算其对一个数 m 的余数。即:

f(n)f(n) % m

例如:


解题思路:

斐波那契数列:斐波那契数列是一个经典的递归问题,其递推关系是:

此中,f(0) = 0,f(1) = 1。

需要注意的是,标题要求计算 f(n) % m,而不直接求 f(n)。所以在计算每个斐波那契数时,我们可以提前取余,这样可以防止数值过大,制止溢出。

代码实现:

  1. public class FibonacciModulo {
  2.     // 求斐波那契数列第n项对m取余
  3.     public static int fibonacciModulo(int n, int m) {
  4.         if (n == 0) return 0;  // f(0) = 0
  5.         if (n == 1) return 1;  // f(1) = 1
  6.         
  7.         int first = 0;  // f(0) = 0
  8.         int second = 1; // f(1) = 1
  9.         int result = 0;
  10.         
  11.         for (int i = 2; i <= n; i++) {
  12.             // 计算下一项,先对m取余,防止结果溢出
  13.             result = (first + second) % m;
  14.             first = second;
  15.             second = result;
  16.         }
  17.         
  18.         return result;
  19.     }
  20.     public static void main(String[] args) {
  21.         int n = 10;  // 第10项
  22.         int m = 100; // 对100取余
  23.         System.out.println(fibonacciModulo(n, m));  // 输出结果
  24.     }
  25. }
复制代码
表明:


 二、模拟题:数字三角形

标题描述:

给定一个数字三角形,要求从三角形的顶部到达底部的路径,使得路径上的数字和最大。每次可以从当前数字向下一行的两个相邻数字之一移动,求最大路径和。

例如:

     3

    7 4

   2 4 6

  8 5 9 3

从顶部的 3 开始,可以选择路径 3 -> 7 -> 4 -> 6 -> 9,路径和为 29。

解题思路:

这个问题可以用动态规划(DP)来办理:


状态转移方程

对于三角形中恣意位置 (i, j),其路径和为:

dp(i,j)=max(dp(i+1,j),dp(i+1,j+1))+triangle(i,j)dp(i, j) = max(dp(i+1, j), dp(i+1, j+1)) + triangle(i, j)

此中 dp(i, j) 表示从位置 (i, j) 到达底部的最大路径和。

代码实现:

  1. public class TrianglePathSum {
  2.     public static int maximumTotal(int[][] triangle) {
  3.         int n = triangle.length;  // 获取三角形的高度
  4.         
  5.         // 从倒数第二行开始向上计算
  6.         for (int row = n - 2; row >= 0; row--) {  
  7.             for (int col = 0; col <= row; col++) {
  8.                 // 状态转移:当前元素加上其下面两个元素中的最大者
  9.                 triangle[row][col] += Math.max(triangle[row + 1][col], triangle[row + 1][col + 1]);
  10.             }
  11.         }
  12.         
  13.         // 返回三角形顶点的最大路径和
  14.         return triangle[0][0];
  15.     }
  16.     public static void main(String[] args) {
  17.         int[][] triangle = {
  18.             {3},
  19.             {7, 4},
  20.             {2, 4, 6},
  21.             {8, 5, 9, 3}
  22.         };
  23.         System.out.println(maximumTotal(triangle));  // 输出最大路径和
  24.     }
  25. }
复制代码
表明:


 三、其他常见题型和本领

1. 背包问题(Knapsack Problem)


2. 子序列问题


3. 区间问题


4. 最短路径问题





 四、总结与易错点

1. 动态规划(DP)常见问题:


2. 常见易错点:


3. 动态规划常见误区:







免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4