计算最大利润的代码

Code for calculating max profit

本文关键字:代码 计算      更新时间:2023-10-16

最近我在iarc网站上发现了这个问题。

我对这个问题的处理方法是,Ramu必须在某一天交易或什么都不做,因为他只能养1头水牛,如果他有1头,他必须卖掉,如果他没有,他必须买。如果我能计算出所有可能的组合,我就能很容易地确定最高利润。但是我的代码似乎不起作用,它提供的输出比预期的要高一点,有时也会遇到更大的测试用例,在尝试了3天之后,有人能在正确的道路上指导我一点吗?下面是我的代码:
#include <iostream>
int bestTrade(int arr[], int size, bool toTrade, int visits, int day) {
  if (day < size - 1) {
    day = day + 1;
    if (visits > 0) {
      if (visits % 2 == 0) {
        int visitsT = visits - 1;
        int trade = bestTrade(arr, size, true, visitsT, day) - arr[day];
        int nothing = bestTrade(arr, size, false, visits, day);
        if (nothing > trade) {
          return nothing;
        } else {
          return trade;
        }
      } else {
        int visitsT = visits - 1;
        int trade = bestTrade(arr, size, true, visitsT, day) + arr[day];
        int nothing = bestTrade(arr, size, false, visits, day);
        if (nothing > trade) {
          return nothing;
        } else {
          return trade;
        }
      }
    } else {
      return 0;
    }
  } else {
    return 0;
  }
}
int main(int argc, char const* argv[]) {
  int n, k;
  std::cin >> n >> k;
  int market[n];
  for (int i = 0; i < n; i++) {
    std::cin >> market[i];
  }
  k = (k / 2) * 2;
  int maxProfitT = bestTrade(market, n, true, k--, 0);
  int maxProfitN = bestTrade(market, n, false, k, 0);
  if (maxProfitN > maxProfitT) {
    std::cout << maxProfitN << std::endl;
  } else {
    std::cout << maxProfitT << std::endl;
  }
  return 0;
}

对于与dynamic programming有关的任何问题,请这样考虑:

如果你知道最多k交易到(i-1)th天的最大利润,你能算出最多k交易到ith天的最大利润吗?

认为…答案是Yes !!!!

假设,在(i-1)th天之前,最多k笔交易的最大利润是best(k,i-1)。你需要找出best(k,i)为任何i<n

如果您选择在i-th天不做任何交易,那么best(k,i)best(k,i-1)相同。如果你想做一个交易,那么best(k,i) = max(value[i] - value[j] + best[k-1][j]), j从0到i '

所以,最后DP公式是:

best[k][i] = max(best[k][i-1], max(value[i] - value[j] + best[k-1][j]), j<i)

对于一个工作代码,你可以看看这里

希望有帮助!!