最近我在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;
}
答案 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<n
与i-th
相同。如果你想进行交易,那么best(k,i)
= max(value [i] - value [j] + best [k-1] [j]),j从0到i`
所以,最后best(k,i-1)
公式最终成为:
best(k,i)
)
对于正常工作的代码,您可以查看here
希望它有所帮助!!!