欢迎光临
我们一直在努力

【C++算法入门】动态规划/贪心算法—灯塔问题

本题参考自蓝桥杯2025国赛B组

一  原题复现

现存灯塔n个,给定点亮序列m{a1,a2,a3…am},其中a1表示第一个操作为点亮编号为a1的灯塔。

每个相邻两个灯塔无法被同时点亮。

求从给定的点亮序列中找到一个子序列,满足能够点亮的最大灯塔数。

二  题意解析

咋一看本题似乎非常复杂。仔细分析,要求从给定的点亮序列m中找子序列,按照题目情景我们翻译过来:无非是有n个灯塔,限定了能点亮的灯塔,在相邻两个灯塔无法被点亮的前提下,以此找到能够点亮的最大灯塔数。 

三  思路分析/代码详解

(一)贪心算法

我们可以利用贪心算法,依次遍历n灯塔,判断其是否在点亮序列中,如果在就点亮并跳过下一个灯塔,如果不在直接跳过本次循环。

代码如下:

(二)动态规划

看到要求最大灯塔数我们自然想到了动态规划,首先建立一个数组dp[n],表示前n个灯塔中最多能点亮的个数。如何确定状态转移方程呢?不妨举个例子:10个灯塔,其中1,2,3,5,6,9,10可以被点亮。从头开始遍历:dp[0]=0、1✅️dp[1]=1,1❌️dp[1]=0、2✅️dp[2]=dp[0]+1,2❌️dp[2]=dp[1]、3✅️dp[3]=dp[1]+1,3❌️dp[3]=dp[2]。到此便出现差异了,当3被点亮时1也被点亮的,2没有被点亮,此时dp[3]=2。而当3没有被点亮此时只有2被点亮dp[3]=1。见微知著,对于某一个灯塔无非两种情况,状态转移方程便可写:dp[i]=max(dp[i-1],dp[i-2]+1)。想到这各位思路是否就清晰了呢,对于这个例子我就不做过多演示了,各位可以继续推导后面的情况。

代码如下:

四  总结

以上便是我关于这道灯塔问题的全部想法了,在这里我罗列了动态规划和贪心算法的思路和代码。距离蓝桥杯还有不到一个月,希望我的文章能够帮到各位。

码字不易,喜欢这篇文章的可以点点赞。

赞(0)
未经允许不得转载:171主机测评 » 【C++算法入门】动态规划/贪心算法—灯塔问题
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址