当前位置:   article > 正文

leetcode | go | 第983题 | 最低票价

leetcode | go | 第983题 | 最低票价

最低票价

go

解决思路

  1. n 为 days[len(days)-1],dp 为长为 n+1 的数组,set 为需要购票的天数的集合
  2. 遍历 days(当前的天数为 day),将 day 加入 set。边界条件为 dp[days[0]] 为 cost[0]、cost[1]、cost[2] 中的最小值
  3. i 从 days[0]+1 遍历到 n。如果 set[i](需要购票),dp[i] = dp[i-1]+cost[0]。如果 i-7>=0,用 dp[i-7]+cost[1] 更新 dp[i],否则用 cost[1] 更新。如果 i-30>=0,用 dp[i-30]+cost[1] 更新 dp[i],否则用 cost[2] 更新。否则,dp[i] = dp[i-1],不需要购票 
  4. return dp[n]
  5. 空间不太好,但是做出来了
  6. 题解思路:(1)记忆化搜索(日期变量型)(2)记忆化搜索(窗口变量型)

相关问题

  1. 急急急急急急我是急急国王
  2. 确实感觉是动态规划
  3. 忽略了当天不需要旅行的情况
  4. 出了很多小 bug,i-7 小于 0 的情况忘记考虑了,
  1. func mincostTickets(days []int, costs []int) int {
  2. n:=days[len(days)-1]
  3. dp:=make([]int,n+1)
  4. set:=map[int]bool{}
  5. for _,day:=range days {
  6. set[day]=true
  7. }
  8. dp[days[0]]=min(costs[0],min(costs[1],costs[2]))
  9. for i:=days[0]+1;i<=n;i++ {
  10. if set[i] {
  11. dp[i]=dp[i-1]+costs[0]
  12. if i-7>=0 {
  13. dp[i]=min(dp[i],dp[i-7]+costs[1])
  14. }else {
  15. dp[i]=min(dp[i],costs[1])
  16. }
  17. if i-30>=0 {
  18. dp[i]=min(dp[i],dp[i-30]+costs[2])
  19. }else {
  20. dp[i]=min(dp[i],costs[2])
  21. }
  22. }else {
  23. dp[i]=dp[i-1]
  24. }
  25. }
  26. //fmt.Println(dp)
  27. return dp[n]
  28. }
  29. func min(a,b int)int {
  30. if a<b {
  31. return a
  32. }
  33. return b
  34. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/398324
推荐阅读
相关标签
  

闽ICP备14008679号