ソートしてDPする。意外と時間がかかった。
class MergersDivTwo {
public:
double findMaximum(vector <int> R, int k)
{
const int N = R.size();
sort(R.begin(), R.end());
vector<double> sum;
partial_sum(R.begin(), R.end(), back_inserter(sum));
double dp[N];
fill(dp, dp + N, -(1e128));
dp[0] = R[0];
for (int i = 0; i <= N - k; ++i) {
for (int j = k; i + j <= N; ++j) {
dp[i + j - 1] = max(dp[i + j - 1], (dp[i] + sum[i + j - 1] - sum[i]) / (double)j);
}
}
return dp[N - 1];
}
};
0 件のコメント :
コメントを投稿