利用Marscode辅助刷题 | 豆包MarsCode AI刷题

4 阅读3分钟

Marscode的AI刷题功能还是非常不错的,这里我基于一个中等题稍微记录一下我的使用思路

原题:股票市场交易策略优化

这个题其实在leetcode有一系列股票交易的原题,如买卖股票的最佳时机等,属于是动态规划的基础题目,其关键思路是在每一天设置多个状态,对应买入或者不买入的决策,然后在不同日期的状态之间的最优值是如何转义的。

先假设我一点不会,尝试询问AI

这道题你拿到手第一思路是什么?

他会回答

拿到这道题,我的第一思路是使用动态规划(Dynamic Programming)来解决。动态规划非常适合处理这类问题,因为它可以通过状态转移来逐步构建最优解。

解题思路

  1. 问题理解: - 我们需要在给定的股票价格数组中,通过多次买卖股票来最大化利润。 - 每次卖出股票后存在一天的冷冻期,冷冻期内不能购买股票。

  2. 状态定义

  • 定义三个状态来表示每一天的不同情况:

    • dp[i][0]:第i天结束时,手中没有股票,且不在冷冻期。
    • dp[i][1]:第i天结束时,手中没有股票,但在冷冻期。
    • dp[i][2]:第i天结束时,手中持有股票。

    ...

这么一来,其实如果有一点基础的话,就能立马知道dp数组就是对应动态规划中递推的状态数组,那么就可以开始递推了,需要注意dp表示的虽然是第i天时的收益,但其实它实质对应的是前i天总共能获得的最佳收益。

  1. 状态转移
  • dp[i][0]:前一天没有股票,或者前一天在冷冻期。
    • dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1])
  • dp[i][1]:前一天卖出股票。
    • dp[i][1] = dp[i - 1][2] + stocks[i]
  • dp[i][2]:前一天持有股票,或者前一天没有股票且不在冷冻期,今天买入。
    • dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][0] - stocks[i])

AI的后续回答其实就指出了,如果要对这三个状态进行转移,就一定要注意互相之间是否互斥,例如前一天如果卖出了股票,那就不能立马买入,需要注意状态设置时哪个状态是冷冻期状态。

基于此就可以写出基础的转移代码了,最后就是注意初始化过程。

  • dp[0][0] = 0:第一天没有股票,不在冷冻期。
  • dp[0][1] = 0:第一天没有股票,但在冷冻期(不可能,但初始化为0)。
  • dp[0][2] = -stocks[0]:第一天买入股票。

需要注意冷冻期在刚开始是没有的,转移是无意义的,但是为了兼容是需要给定一个初始值,至少不引起错误即可。

最后返回时,就是return Math.max(dp[n - 1][0], dp[n - 1][1]),将前n-1天的最大收入返回即可。

其实,以上这些引用内容都是AI生成的,AI基本上在简单引导下就立马反应过来如何分析问题,那么接下来直接按照它的思路还原代码就ok了。

最后,实在不放心,让Marscode按照默认提示帮我检查一下编辑区的代码进行了一下代码完成的检查,最终通过了测试。

总结一下大概使用流程,其实就是先问思路,然后基于思路对代码进行还原,我这里比较顺利,没有反复的battle过程,但如果出现不对的情况,不应该反复要求AI自己纠错,而是要自己注意指出AI的错误在哪,然后才能比较好的生成新的反馈,最终生成较好的代码。这个套路对简单到中等的题目一般都是比较适用的,而且询问的过程其实也是学习的过程。