当前位置: 首页 > news >正文

从递归到动态规划-最低票价

在这里插入图片描述

最低票价

#include<iostream>
#include<vector>
using namespace std;const int inf = 1e9;
vector<int>dur_days = { 1,7,30 };
//f(i)表示从第i天开始,之后的最低票价
//写递归函数的时候注意递归出口和边界条件
int f1(vector<int>& days, vector<int>& costs, int i) {if (i == days.size()) return 0;int ans = inf;//枚举当前状态下面临的三种选择,返回三种选择中最优的答案,j用来寻找下一个去到的状态的下标for (int k = 0, j = i; k < 3; ++k) {while (j < days.size() && days[j] < days[i] + dur_days[k]) {j++;}ans = min(ans, costs[k] + f1(days, costs, j));}return ans;
}//增加记忆化数组
int f2(vector<int>& days, vector<int>& costs, int i, vector<int>& dp) {if (i == days.size()) return 0;if (dp[i] != -1) return dp[i];int ans = inf;for (int k = 0, j = i; k < 3; ++k) {while (j < days.size() && days[j] < days[i] + dur_days[k]) {j++;}if (dp[j] != -1) ans = min(ans, costs[k] + dp[j]);else ans = min(ans, costs[k] + f2(days, costs, j, dp));}dp[i] = ans;return ans;
}//从递归到dp
//dp的状态转移方程就从递归中去找出来
//dp(i)表示第i天之后的最小票价
int f3(vector<int>& days, vector<int>& costs) {int n = days.size();vector<int>dp(n + 5, inf);dp[n] = 0;//注意边界条件//跟递归反过来更新for (int i = n - 1; i >= 0; i--) {for (int k = 0, j = i; k < 3; ++k) {while (j < n && days[j] < days[i] + dur_days[k]) {j++;}dp[i] = min(dp[i], costs[k] + dp[j]);//当前状态只取决于之前的状态}}return dp[0];
}
int mincostTickets1(vector<int>& days, vector<int>& costs) {return f1(days, costs, 0);
}
int mincostTickets2(vector<int>& days, vector<int>& costs) {vector<int> dp(days.size() + 5, -1);return f2(days, costs, 0, dp);
}
int mincostTickets3(vector<int>& days, vector<int>& costs) {return f3(days, costs);
}
int main() {return 0;
}
http://www.dtcms.com/a/309834.html

相关文章:

  • 3. boost::asio之同步读写的客户端和服务器示例
  • 一体化伺服电机在外观检测设备中的应用与优化
  • MyBatis详解
  • 面向对象学习(一)
  • 服务器地域选择指南:深度分析北京/上海/广州节点对网站速度的影响
  • Trice移植(Start with Trice)
  • 网站建设服务器从入门到上手
  • 层次聚类:无需“猜”K值,如何让数据自己画出“家族图谱”?
  • 31. 伪类和伪元素区别
  • PyTorch深度学习快速入门学习总结(四)
  • JS-第十九天-事件(一)
  • safari添加主屏及PWA启动方式
  • 玩转ChatGPT:寻找仪器用户手册
  • TEM在量子点发光材料领域的应用-测试GO
  • 汇川ITS7100E触摸屏交互界面开发(一)调试事项说明
  • BIFU币富探索合规新路径 助力用户玩转RWA
  • 两步走解决家庭路由器无法上网
  • Java 根据多个 MM-dd 日期计算总时长(包含当日和次日)
  • python PIL图片转base64字符串
  • [极客大挑战 2019]RCE ME
  • RockAI 的破壁之战:Yan 架构如何啃下“端侧炼丹”硬骨头?
  • Vue3 setup、ref和reactive函数
  • 元策联盈:深耕金融领域,赋能行业发展​
  • 【Flutter3.8x】flutter从入门到实战基础教程(四):自定义实现一个自增的StatefulWidget组件
  • 磁力搜索+磁力下载!无需解释!直接上车!
  • 工作好用小工具积累
  • EGE 流量开关 LG 518 GSP P11237
  • 异步函数被调用多次,多次处理同一个文件导致占用,如何让异步函数按顺序执行?
  • 书生浦语第五期L0G2
  • 【音视频】WebRTC 中的RTP、RTCP、SDP、Candidate