当前位置: 首页> 游戏> 手游 > 3117. 划分数组得到最小的值之和

3117. 划分数组得到最小的值之和

时间:2025/7/12 6:35:11来源:https://blog.csdn.net/weixin_45256307/article/details/141669033 浏览次数:1次

3117. 划分数组得到最小的值之和


题目链接:3117. 划分数组得到最小的值之和

代码如下:

//参考链接:https://leetcode.cn/problems/minimum-sum-of-values-by-dividing-array/solutions/2739258/ji-yi-hua-sou-suo-jian-ji-xie-fa-by-endl-728z
class Solution 
{
public:int minimumValueSum(vector<int>& nums, vector<int>& andValues) {const int INF = INT_MAX / 2; // 除 2 防止下面 + nums[i] 溢出int n = nums.size(), m = andValues.size();unordered_map<long long, int> memo;auto dfs = [&](auto&& dfs, int i, int j, int and_) -> int{if (n - i < m - j) // 剩余元素不足{ return INF;}if (j == m)// 分了 m 段{ return i == n ? 0 : INF;}and_ &= nums[i];// 三个参数压缩成一个 long longlong long mask = (long long) i << 36 | (long long) j << 32 | and_;if (memo.contains(mask)) { // 之前计算过return memo[mask];}int res = dfs(dfs, i + 1, j, and_); // 不划分if (and_ == andValues[j]) // 划分,nums[i] 是这一段的最后一个数{ res = min(res, dfs(dfs, i + 1, j + 1, -1) + nums[i]);}return memo[mask] = res; // 记忆化};int res = dfs(dfs, 0, 0, -1);return res < INF ? res : -1;}
};
关键字:3117. 划分数组得到最小的值之和

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: