当前位置: 首页 > news >正文

C++——矩阵无重复行列取数问题

矩阵无重复行列取数问题


题目:有一个矩阵,我每次可以取一个数,后面再取数时不能再取该数所在行和列的其他数,我现在想一直取直到无法再取数位置,现在想要取到的数的和最大,问应该怎么取,最大的和是多少。

思路:动态规划,来源chatGPT,使用rowMask和colMask表示当前的行和列的选择状态,动态规划每次输入一个选择状态,输出该选择状态下的最大的和,转移方程是从每次选择状态可以得到下一次可以选择的元素位置,遍历,得到最大的,返回。

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int n; // 代表矩阵阶数
const int MAXN = 10; // 矩阵最大阶数
int matrix[MAXN][MAXN];
vector<vector<int>> path; // 记录每行在不同列选取状态下的最佳列选择
int solve(int row, int colMask) // 返回在当前的这个选择状态下的最大和
{// 结束条件if (row == n) // 说明都被选择了{return 0;}int maxSum = 0;for (int j = 0; j < n; j++){if ((colMask & (1 << j)) == 0) // 表示第j列还没有被选择{int curSum = matrix[row][j] + solve(row+1, colMask | (1 << j)); // 选择第(i,j)个,并将状态添加进去。if (curSum > maxSum){maxSum = curSum;path[row][colMask] = j;}		}}return maxSum;
}int main()
{n = 4;vector<vector<int>> nums(n, vector<int>(n));nums = { {1,2,3,4},{4,5,6,7},{7,8,9,10}, {8,7,3,1} };path.assign(n, vector<int>(1 << n, -1)); // 初始化 path 表for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){matrix[i][j] = nums[i][j];}}cout << solve(0, 0) << endl;// 恢复并输出选择的路径vector<pair<int, int>> solution;int colMask = 0;for (int row = 0; row < n; ++row) {int col = path[row][colMask]; // 在已经选择了一些列和行的情况下的下一个最优选择solution.emplace_back(row, col);colMask |= (1 << col); // 标记选择了某一列}for (int i = 0; i < n; i++){cout << solution[i].first << ' ' << solution[i].second << endl;}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 力扣周赛:第415场周赛
  • 探索轻量级语言模型 GPT-4O-mini 的无限可能
  • JavaScript考核详解
  • 基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)
  • 深度解析 MintRich 独特的价格曲线机制玩法
  • 【宠物小精灵之收服(待更新)】
  • 【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目
  • 安全建设当中的冷门知识
  • 简单题27 - 移除元素(Java)20240917
  • 如何在win10Docker安装Mysql数据库?
  • JavaSE - 面向对象编程03
  • Qt | AI+Qt6.5.3+ubuntu20.04+FFmpeg实现音视频编解码(播放一个中秋节快乐视频为例)
  • 安全API
  • LeetCode 815.公交路线(BFS广搜 + 建图)(中秋快乐啊)
  • 【AcWing】前缀和与差分(一维 + 二维)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • es6(二):字符串的扩展
  • Fabric架构演变之路
  • node-glob通配符
  • redis学习笔记(三):列表、集合、有序集合
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • supervisor 永不挂掉的进程 安装以及使用
  • ubuntu 下nginx安装 并支持https协议
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vue脚手架vue-cli
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 记一次删除Git记录中的大文件的过程
  • 解析 Webpack中import、require、按需加载的执行过程
  • 解析带emoji和链接的聊天系统消息
  • 前端之Sass/Scss实战笔记
  • 如何解决微信端直接跳WAP端
  • 使用API自动生成工具优化前端工作流
  • 使用docker-compose进行多节点部署
  • 使用parted解决大于2T的磁盘分区
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 正则表达式-基础知识Review
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #FPGA(基础知识)
  • #window11设置系统变量#
  • #职场发展#其他
  • (C语言)fread与fwrite详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (MATLAB)第五章-矩阵运算
  • (Note)C++中的继承方式
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (第三期)书生大模型实战营——InternVL(冷笑话大师)部署微调实践
  • (分类)KNN算法- 参数调优
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (三十五)大数据实战——Superset可视化平台搭建
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424