计算最大利润的代码

时间:2016-10-06 05:59:38

标签: c++ algorithm recursion dynamic-programming

最近我在IARCS网站上遇到了this问题。

我解决这个问题的方法就像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;
}

1 个答案:

答案 0 :(得分:3)

对于与dynamic programming有关的任何问题,请以这种方式考虑:

如果您知道最多k次交易的最大利润,直到(i-1)th天,您是否能够计算出最多k次交易的最大利润,直到{{} 1天??

想想......答案是ith !!!!

比如说,Yes天之前最多k次交易的最大利润为(i-1)th。您需要查找任何best(k,i-1)的{​​{1}}。

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

所以,最后best(k,i-1)公式最终成为:

best(k,i)

对于正常工作的代码,您可以查看here

希望它有所帮助!!!