From ef873f727b1eb8856e6303e2051f710b7e68095b Mon Sep 17 00:00:00 2001 From: Ashesh Karmakar <72907212+Asheshz@users.noreply.github.com> Date: Sun, 12 Oct 2025 04:46:05 +0530 Subject: [PATCH] 3186. Maximum Total Damage With Spell Casting Please accept my PR request --- October 2025/october_12.java | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 October 2025/october_12.java diff --git a/October 2025/october_12.java b/October 2025/october_12.java new file mode 100644 index 0000000..cba29ef --- /dev/null +++ b/October 2025/october_12.java @@ -0,0 +1,41 @@ +class Solution { + public long maximumTotalDamage(int[] power) { + Map count = new HashMap<>(); + + for (final int damage : power) + count.merge(damage, 1, Integer::sum); + + List uniqueDamages = getSortedUniqueDamages(count); + final int n = uniqueDamages.size(); + // dp[i][k] := the maximum damage using uniqueDamages[0..i], where k + // indicates if the i-th damage is used + long[][] dp = new long[n][2]; + + for (int i = 0; i < n; ++i) { + final int damage = uniqueDamages.get(i); + if (i == 0) { + dp[0][0] = 0; + dp[0][1] = (long) damage * count.get(damage); + continue; + } + dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]); + dp[i][1] = (long) damage * count.get(damage); + if (i >= 1 && uniqueDamages.get(i - 1) != damage - 1 && + uniqueDamages.get(i - 1) != damage - 2) { + dp[i][1] += Math.max(dp[i - 1][0], dp[i - 1][1]); + } else if (i >= 2 && uniqueDamages.get(i - 2) != damage - 2) { + dp[i][1] += Math.max(dp[i - 2][0], dp[i - 2][1]); + } else if (i >= 3) { + dp[i][1] += Math.max(dp[i - 3][0], dp[i - 3][1]); + } + } + + return Math.max(dp[n - 1][0], dp[n - 1][1]); + } + + private List getSortedUniqueDamages(Map count) { + List uniqueDamages = new ArrayList<>(count.keySet()); + Collections.sort(uniqueDamages); + return uniqueDamages; + } +}