题目:
由于可能存在相同伤害的咒语,而如果选择了有多个同伤害的咒语,那么总伤害要加上该伤害*该伤害咒语的数量。因此我们可以先保存每个伤害值的咒语数量,然后将power去重。
将power去重排序后,令 f(i) 表示从第 0 到 i 种咒语中选择,并且最后选择第 i 种咒语的最大总伤害,可列出状态转移方程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <algorithm> #include <unordered_map> #include <vector>
using std::unordered_map; using std::vector;
class Solution { public: long long maximumTotalDamage(vector<int> &power) { int i, j, n; long long max = 0, ans = 0; unordered_map<long, long> count;
for (int p : power) { count[p]++; }
power.erase(std::unique(power.begin(), power.end()), power.end()); std::sort(power.begin(), power.end());
n = power.size();
vector<long long> f(n, 0); f[0] = power[0] * count[power[0]];
for (i = 1, j = 0; i < n; i++) { while (j < i && power[j] < power[i] - 2) { max = std::max(max, f[j]); j++; } f[i] = max + power[i] * count[power[i]]; }
ans = *std::max_element(f.begin(), f.end());
return ans; } };
|