LeetCode-1995-统计特殊四元组
题目
给你一个 下标从 0 开始 的整数数组 nums,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目:
nums[a] + nums[b] + nums[c] == nums[d] ,且 a < b < c < d
示例
|
|
|
|
|
|
解答
思路 1
暴力枚举,结果通过了??
思路 2
来自三叶姐姐的解题思路,利用等式关系 nums[a] + nums[b] + nums[c] = nums[d]nums[a]+nums[b]+nums[c]=nums[d],具有明确的「数值」和「个数」关系,可将问题抽象为组合优化问题求方案数。
限制组合个数的维度有两个,均为「恰好」限制,转换为「二维费用背包问题求方案数」问题。
定义 f[i][j][k]为考虑前 i 个物品(下标从 1 开始),凑成数值恰好 j,使用个数恰好为 k 的方案数。
最终答案为 $$\sum_{i = 3}^{n - 1}(f[i][nums[i]][3])$$起始状态 f[0][0][0]=1 代表不考虑任何物品时,所用个数为 0,凑成数值为 0 的方案数为 1。
不失一般性考虑 $$f[i][j][k]$$ 该如何转移,根据 $$nums[i - 1]$$ 是否参与组合进行分情况讨论:
nums[i - 1] 不参与组成,此时有:$$f[i - 1][j][k]$$ nums[i - 1] 参与组成,此时有:$$f[i - 1][j - t][k - 1]$$ 最终 $$f[i][j][k]$$为上述两种情况之和,最终统计 $$\sum_{i = 3}^{n - 1}(f[i][nums[i]][3])$$即是答案。
代码
|
|
|
|