2023-08-01每日一题
一、题目编号
2681. 英雄的力量
二、题目链接
点击跳转到题目位置
三、题目描述
给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为:
i0 ,i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] … nums[ik])2 * min(nums[i0],nums[i1] … nums[ik]) 。
请你返回所有可能的 非空 英雄组的 力量 之和。由于答案可能非常大,请你将结果对 109 + 7 取余。
示例1:
示例2:
提示:
- 1 <= nums.length <= 105
- 1 <= nums[i] <= 109
四、解题代码
class Solution {
public:
int sumOfPower(vector<int>& nums) {
int n = nums.size();
sort(nums.begin(), nums.end());
vector<int> dp(n);
vector<int> preSum(n + 1);
int res = 0, mod = 1e9 + 7;
for (int i = 0; i < n; i++) {
dp[i] = (nums[i] + preSum[i]) % mod;
preSum[i + 1] = (preSum[i] + dp[i]) % mod;
res = (int) ((res + (long long) nums[i] * nums[i] % mod * dp[i]) % mod);
if (res < 0) {
res += mod;
}
}
return res;
}
};
五、解题思路
(1) 运用前缀和+动态规划解决问题。