1799.N 次操作后的最大分数和
【LetMeFly】1799.N 次操作后的最大分数和
力扣题目链接:https://leetcode.cn/problems/maximize-score-after-n-operations/
给你 nums
,它是一个大小为 2 * n
的正整数数组。你必须对这个数组执行 n
次操作。
在第 i
次操作时(操作编号从 1 开始),你需要:
- 选择两个元素
x
和y
。 - 获得分数
i * gcd(x, y)
。 - 将
x
和y
从nums
中删除。
请你返回 n
次操作后你能获得的分数和最大为多少。
函数 gcd(x, y)
是 x
和 y
的最大公约数。
示例 1:
输入:nums = [1,2] 输出:1 解释:最优操作是: (1 * gcd(1, 2)) = 1
示例 2:
输入:nums = [3,4,6,8] 输出:11 解释:最优操作是: (1 * gcd(3, 6)) + (2 * gcd(4, 8)) = 3 + 8 = 11
示例 3:
输入:nums = [1,2,3,4,5,6] 输出:14 解释:最优操作是: (1 * gcd(1, 5)) + (2 * gcd(2, 4)) + (3 * gcd(3, 6)) = 1 + 4 + 9 = 14
提示:
1 <= n <= 7
nums.length == 2 * n
1 <= nums[i] <= 106
方法一:状压DP(状态压缩 + 动态规划)
首先预处理将$nums[i]$和$nums[j]$的最大公因数计算出来存入$gcd[i][j]$中(其中$0\leq i<j<n$)
1 |
|
然后开辟一个大小为$2^n$的数组$dp[1<<n]$,其中$dp[i]$代表状态为$i$时或获得的最大分数。
从小到大枚举所有的状态(最大$1<<n$)
1 |
|
对于每个状态$state$,首先计算$state$在二进制下有多少个$1$
如果$state$在二进制下有偶数个$1$,那么就枚举其中$1$的位置,让其中的$1$两两配对,同时更新$dp[state]$的最大值
假设我们让其中的第$i$位和第$j$位配对了,那么$dp[state]$就可以由($ij$配对)和(剩下的元素配对$dp[state - (1 << i) - (1 << j)]$)加起来得到。
- 时间复杂度$O(2^n\times n^2)$
- 空间复杂度$O(2^n+n^2)$
AC代码
C++
1 |
|
同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/128409728
1799.N 次操作后的最大分数和
https://blog.letmefly.xyz/2022/12/22/LeetCode 1799.N次操作后的最大分数和/