一、动态规划(Dynamic Programming)
算法解析
动态规划是蓝桥杯高频考点,其核心思想是将复杂问题分解为一系列相互关联的子问题,通过记录子问题的解避免重复计算,利用状态转移方程逐步推导出原问题的最优解。常见题型包括背包问题、最长递增子序列(LIS)等。在解决动态规划问题时,关键在于定义状态和状态转移方程,以及确定边界条件。
真题实战
题目:0-1 背包问题(2020 年省赛)描述:给定n个物品,每个物品有重量w和价值v,背包容量为W,求能装入背包的最大价值。每个物品只能选择放入或不放入(0-1 选择)。
fun knapsack(n: Int, W: Int, weights: IntArray, values: IntArray): Int {
// 创建二维数组dp,dp[i][j]表示考虑前i个物品,背包容量为j时的最大价值
val dp = Array(n + 1) { IntArray(W + 1) }
for (i in 1..n) { // 遍历每个物品
for (j in 0..W) { // 遍历每个背包容量
// 如果当前物品重量大于背包容量j,无法放入该物品,价值与前i-1个物品相同
if (weights[i - 1] > j) {
dp[i][j] = dp[i - 1][j]
} else {
// 否则,取不放入该物品(dp[i - 1][j])和放入该物品(dp[i - 1][j - weights[i - 1]] + values[i - 1])的较大值
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i - 1]] + values[i - 1])
}
}
}
// 返回考虑完所有n个物品,背包容量为W时的最大价值
return dp[n][W]
}
二、贪心算法(Greedy Algorithms)
算法解析
贪心算法通过在每一步选择当前状态下的局部最优解,逐步构建全局最优解。适用于区间调度、哈夫曼编码等问题。但贪心算法的正确性依赖于问题的贪心选择性质,即每一步的局部最优选择不会影响最终的全局最优解,因此使用时需要谨慎证明策略的正确性。
真题实战
题目:区间覆盖(2019 年国赛)描述:给定n个区间,每个区间由起始点和结束点表示,目标是选择最少的区间,使其能够覆盖整个数轴上的目标区间[targetStart, targetEnd]。
data class

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



