3259.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <vector>
  2. #include <iostream>
  3. #include "math.h"
  4. using namespace std;
  5. // 3259. 能量提升
  6. // 动态规划+贪心 递推式:dp[i] += max(now[i-1], next[i-2])
  7. long long maxEnergyBoost(vector<int> &energyDrinkA, vector<int> &energyDrinkB)
  8. {
  9. int n = energyDrinkA.size();
  10. vector<vector<long long>> dp(n + 1, vector<long long>(2, 0));
  11. dp[1][0] = energyDrinkA[0];
  12. dp[1][1] = energyDrinkB[0];
  13. for (int i = 2; i <= n; i++)
  14. {
  15. dp[i][0] = energyDrinkA[i - 1] + max(dp[i - 1][0], dp[i - 2][1]);
  16. dp[i][1] = energyDrinkB[i - 1] + max(dp[i - 1][1], dp[i - 2][0]);
  17. }
  18. return max(dp[n][0], dp[n][1]);
  19. }
  20. long long maxEnergyBoost(int* energyDrinkA, int energyDrinkASize, int* energyDrinkB, int energyDrinkBSize) {
  21. int n = energyDrinkASize;
  22. long long **dp = (long long **)malloc(sizeof(long long *) * 2);
  23. dp[0] = (long long *)malloc(sizeof(long long) * (n + 1));
  24. dp[1] = (long long *)malloc(sizeof(long long) * (n + 1));
  25. dp[0][0] = 0;
  26. dp[1][0] = 0;
  27. dp[0][1] = energyDrinkA[0];
  28. dp[1][1] = energyDrinkB[0];
  29. for (int i = 2; i <= n; i++)
  30. {
  31. dp[0][i] = energyDrinkA[i-1] + fmax(dp[0][i-1], dp[1][i-2]);
  32. dp[1][i] = energyDrinkB[i-1] + fmax(dp[1][i-1], dp[0][i-2]);
  33. }
  34. return fmax(dp[0][n], dp[1][n]);
  35. }
  36. // 空间优化
  37. long long maxEnergyBoost1(int* energyDrinkA, int energyDrinkASize, int* energyDrinkB, int energyDrinkBSize) {
  38. int n = energyDrinkASize;
  39. long long tmp[3]={energyDrinkA[0],energyDrinkB[0],energyDrinkA[0]};
  40. for (int i = 1; i < energyDrinkASize; i++) {
  41. tmp[0]=fmax(tmp[0]+energyDrinkA[i],tmp[1]);
  42. tmp[1]=fmax(tmp[1]+energyDrinkB[i],tmp[2]);
  43. tmp[2]=tmp[0];
  44. }
  45. return fmax(tmp[0],tmp[1]);
  46. }
备用站点 当前处于降级运行的备用站点,仅供应急访问,数据和功能可能不是最新。