当前位置:   article > 正文

Leetcode刷题笔记题解(C++):腾讯笔试-假期(动态规划)_leetcode 健身计划 愉悦值 前一天健身 后天不能健身

leetcode 健身计划 愉悦值 前一天健身 后天不能健身

思路:动态规划的思路,第i天与第i-1天的活动有关,以及公司营业或者 健身房营业都有关

如果当天选择休息,则上一天的 最小休息值+1即可

如果当天选择工作,则等于上一天选择休息 或者健身的最小休息值即可

如果当天选择健身,则等于上一天选择休息 或者工作的最小休息值即可

 注意的是还要 判断当天的公司以及健身房的情况

代码如下:

  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. using namespace std;
  5. #define INFINITY 65536
  6. //dp[i][0],dp[i][1], dp[i][2] 分别记录第i天 休息/锻炼/工作时累计的最小休息天数.
  7. int main() {
  8. int n;
  9. cin >> n;
  10. vector<int>gym(n);
  11. vector<int>company(n);
  12. for (int i = 0; i < n; i++)
  13. cin >> company[i];
  14. for (int i = 0; i < n; i++)
  15. cin >> gym[i];
  16. vector<vector<int>>dp(n + 1, vector<int>(3, INFINITY));//初始化
  17. dp[0][0] = dp[0][1] = dp[0][2] = 0;//初始化
  18. for (int i = 1; i < n + 1; i++)
  19. {
  20. if (company[i - 1] == 1 && gym[i - 1] == 1)//如果第i天公司开门,健身房也开门
  21. {
  22. dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;//第i天可以选择休息
  23. dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);//第i天选择健身,则上一天只能是休息或者工作,第i天没有休息,只能在之前的选择的休息工作中取最小值
  24. dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);//第i天可以选择工作
  25. }
  26. else if (gym[i - 1] == 1)//如果第i天只有健身房开门
  27. {
  28. dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;//第i天可以选择休息
  29. dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);//第i天可以选择健身
  30. }
  31. else if (company[i - 1] == 1)//如果第i天只有公司开门
  32. {
  33. dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;//第i天可以选择休息
  34. dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);//第i天可以选择工作
  35. }
  36. else//如果第i天都不开门
  37. {
  38. dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;//第i天只能选择休息
  39. }
  40. }
  41. int res = min(dp[n][0], min(dp[n][1], dp[n][2]));//选出最小休息的时间
  42. cout << res << endl;
  43. return 0;
  44. }

 

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

闽ICP备14008679号