这个状态转移方程怎么理解呀,看了题解还是不知道怎么得到的,求帮助
2条回答 默认 最新
- 阿里嘎多学长 2024-06-07 18:19关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
这个问题是一个典型的动态规划问题。首先,我们来理解问题描述和构建状态转移方程。
问题描述理解
题目描述了一个场景,其中forever97是队伍的核心,Trote_w需要连续请他吃n天饭。但forever97有两个要求:
- 只能吃他喜欢的三家外卖中的任意一家。
- 不能连续三天吃同一家外卖。
状态定义
我们可以定义状态
dp[i]
表示在第i天结束时,forever97有几种不同的外卖选择方法。状态转移方程
状态转移方程的推导基于前一天的选择:
- 如果第i天forever97吃的是第一家外卖,那么前一天(第i-1天)不能是第一家外卖,因此前一天的选择方法数是
dp[i-1]
减去第i-1天吃第一家外卖的情况。 - 同理,第i天如果吃第二家或第三家外卖,前一天的选择方法数也是
dp[i-1]
减去第i-1天吃相应外卖的情况。
因此,状态转移方程可以表示为: [ dp[i] = (dp[i-1] - dp[i-3]) \times 3 ] 这里,
dp[i-3]
表示如果第i天选择的外卖是第i-3天相同的外卖,这种情况需要减去。由于forever97有三家外卖可以选择,所以乘以3。mod1e9+7的操作
由于问题中提到结果可能非常大,我们需要对结果进行取模操作。这里的
mod1e9+7
实际上是10^9 + 7
,这是一个常用的大数取模数,可以防止整数溢出。算法实现
- 初始化
dp[0]
至dp[2]
,因为第一天开始时只有一种选择,第二天也只有一种选择,第三天有三种选择(因为不能连续两天吃同一家外卖)。 - 从第四天开始,使用状态转移方程计算
dp[i]
。 - 循环直到第n天,得到
dp[n]
。
代码实现
MOD = 10**9 + 7 def count_ways(n): if n == 0: return 0 elif n == 1 or n == 2: return 1 elif n == 3: return 3 dp = [0] * (n + 1) dp[0], dp[1], dp[2], dp[3] = 1, 1, 1, 3 for i in range(4, n + 1): dp[i] = (dp[i - 1] - dp[i - 3] + MOD) % MOD return dp[n] # 示例输入 T = int(input()) for _ in range(T): n = int(input()) print(count_ways(n))
参考资料
请注意,上述代码只是一个简单的示例实现,可能需要根据实际输入格式进行调整。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
- ¥50 浦育平台scratch图形化编程
- ¥20 求这个的原理图 只要原理图
- ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
- ¥20 微信的店铺小程序如何修改背景图
- ¥15 UE5.1局部变量对蓝图不可见
- ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
- ¥20 sentry如何捕获上传Android ndk 崩溃
- ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
- ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?