- 第i月に入る収入は、第i月以降で最もリターンの高い投資機会(株とタイミングの組み合わせ)に全額投資するのが最も効率的
- 上の考察をそのままコードに落とすだけ。
- maxGain=1で初期化しているので、ループの最初のretの更新ではretは変化しない。けど、こうしておいた方が便利。
- retの更新式をiのループの最後に持って来て、iのループの継続条件を i >= 1 にしても良い。しかし、この場合、iのループを抜けた後に、inititalInvestmentに掛け合わせるためのmaxGainの計算をiのループの外にもう一回書かないといけない。
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <iterator>
using namespace std;
class StockHistory{
public:
vector<vector<int> > price;
int n;
int nstock;
void print(){
for(int i = 0; i < n; i++){
copy(price[i].begin(), price[i].end(), ostream_iterator<int>(cout, "\t"));
cout << endl;
}
}
int maximumEarnings(int initialInvestment, int monthlyContribution, vector <string> stockPrices){
n = stockPrices.size();
price = vector<vector<int> >(n, vector<int>(0));
for(int i = 0; i < n; i++){
int buf;
stringstream sst(stockPrices[i]);
while(!sst.eof()){
sst >> buf;
price[i].push_back(buf);
}
}
nstock = price[0].size();
double ret = 0;
int maxGainTerm = n - 1;
int maxGainStock = 0;
double maxGain = 1;
for(int i = n - 2; i >= 0; i--){
ret += (maxGain - 1) * monthlyContribution;
for(int j = 0; j < nstock; j++){
double tempGain = (double)price[n - 1][j] / price[i][j];
if(maxGain < tempGain){
maxGainTerm = i;
maxGainStock = j;
maxGain = tempGain;
}
}
}
ret += (maxGain - 1) * initialInvestment;
return ret;
}
};