algorithm - 动态规划问题,找到对商店的最佳访问
问题描述
假设我们有一个商店列表,这些商店在访问时包含一些价值。例如 store_value = [2,4,9,1,4,2]。
从一个商店跑到另一个商店收集价值有一些成本,例如run_cost = [0,1,2,3,1,2]。也就是说,如果我在商店 i = 3(不是 0 索引)处收集价值 9,它将具有成本 2,这意味着由于所需的成本,我将无法访问之前的 2 家商店。考虑它在运行存储 i 之前的休息量。
现在使用动态规划,我们可以说 V(x,i),其中 V(0,i) 是在第一个 i 存储之后可获得的最大值,如果我们不运行存储 i。V(1,i) 是第一个 i 存储后可获得的最大值,如果我们确实运行存储 i。
从商店 i = 1..6 运行的 P(0,i) 和 P(1,i) 会是什么样子?
我尝试运行算法,但有些东西告诉我我做错了什么。据我所知:
P(0,1) = 0, P(1,1) = 2
从这里开始,我认为我错了: P(0,2) = 2, P(1,2) = 4 ... 等等
如果有人可以帮助我理解我应该如何思考这个问题,我会非常感激。
解决方案
一个更简单的公式是定义V(i)
为可以通过 stores 实现的最大值1..i
。那么递归定义是:
V(i) = max(
V(i - 1), //do not visit store i
store_value[i] + V(i - run_cost[i] - 1) //visit store i
)
run_cost
在 .时需要注意一些0
。
推荐阅读
- powershell - Azure AD 设备注册列
- docker - 将第四个组织添加到 Hyperledger Fabric 2.0 时出错
- node.js - Node.js 中的进程 vs Worker vs 线程 vs 任务 vs 池
- firebase - 如何删除 Firebase Firestore 中的选定文档
- swift - '没有为具有标识符的任务注册启动处理程序......'(Swift)
- java - EntityScanner 是否检测抽象类和接口?(Spring Boot 2.2.6)
- c# - 如何暂停线程?
- javascript - 猛犸象没有找到任何模块
- javascript - 在 JavaScript 中,确定字符串中第一个字符的最高效方法是:startsWith、charAt 或 [0]
- angular - 在更改模型上动态加载组件时出错