[动态规划]矩阵取数游戏

矩阵取数游戏

题目描述

帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n行*m列的矩阵,矩阵中的每个元素aij均为非负整数。游戏规则如下:
1. 每次取数时须从每行各取走一个元素,共n个。m次后取完矩阵所有的元素;
2. 每次取走的各个元素只能是该元素所在行的行首或行尾;
3. 每次取数都有一个得分值,为每行取数的得分之和;每行取数的得分 = 被取走的元素值*i,其中i表示第i次取数(从1开始编号);
4. 游戏结束总得分为m次取数得分之和。
帅帅想请你帮忙写一个程序,对于任意矩阵,可以求出取数后的最大得分。

关于输入

包括n+1行;
第一行为两个用空格隔开的整数n和m。
第2~n+1行为n*m矩阵,其中每行有m个用单个空格隔开
l<=n,m<=80,1<=aij<=1000

关于输出

仅包含1行,为一个整数,即输入矩阵取数后的最大的分。

例子输入
2 3
1 2 3
3 4 2
例子输出
34
解题分析

这个问题的具体描述是:给定一个n行m列的矩阵,每次从每行中取走一个元素(只能是行首或行尾的元素),每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值*i,其中i表示第i次取数。求取数后的最大得分。

程序的主要思路如下:

1. 首先,程序读取两个整数n和m,然后读取n行m列的矩阵,存储在数组`a`中。

2. 然后,程序对每一行进行处理。对于每一行,程序初始化一个二维数组`dp`,`dp[i][j]`表示从第i个元素到第j个元素(包括i和j)的子数组中,取数的最大得分。

3. 程序遍历所有可能的子数组长度(从1到m)。对于每一个子数组长度,程序遍历所有可能的子数组的起始位置。

   - 如果子数组长度为1,那么`dp[i][j]`就等于`m * a[row][i]`,因为子数组只有一个元素,所以取数的得分就是`m * a[row][i]`。

   - 如果子数组长度大于1,那么`dp[i][j]`就等于`dp[i+1][j] + (m-len+1) * a[row][i]`和`dp[i][j-1] + (m-len+1) * a[row][j]`中的较大值。这是因为,我们可以选择取第i个元素或者第j个元素,所以我们需要比较这两种选择的得分,取较大的那个。

4. 对于每一行,`dp[0][m-1]`就是这一行的最大得分。程序将所有行的最大得分累加起来,就得到了总的最大得分。

这个程序的时间复杂度是O(n*m^2),因为它需要对每一行遍历所有可能的子数组。如果矩阵的大小非常大,那么这个程序可能会运行得比较慢。

代码实现
#include <iostream>
#include <cstring>
using namespace std;int dp[85][85];
int a[85][85];int main() {int n,m; cin>>n>>m;int ans=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];}for(int row=0;row<n;row++){memset(dp,0,sizeof(dp));for(int len=1;len<=m;len++)for(int i=0;i<m && i+len-1<m;i++){int j=i+len-1;if(len==1){dp[i][j]=m*a[row][i];}else{dp[i][j]=max(dp[i+1][j]+(m-len+1)*a[row][i],dp[i][j-1]+(m-len+1)*a[row][j]);}}ans+=dp[0][m-1];}cout<<ans<<endl;return 0;
}
当然,使用记忆搜索法也不错

这个程序是用来解决“矩阵取数游戏”问题的改进版本。它仍然使用了动态规划的思想,但是采用了记忆化搜索的方法,将递归的过程中重复的子问题的解存储起来,避免了重复计算,从而提高了效率。

程序的主要思路如下:

1. 首先,程序读取两个整数n和m,然后读取n行m列的矩阵,存储在数组`a`中。

2. 然后,程序对每一行进行处理。对于每一行,程序使用一个记忆化搜索的函数`f(i, j)`来计算从第i个元素到第j个元素(包括i和j)的子数组中,取数的最大得分。

3. 函数`f(i, j)`的定义如下:

   - 如果`dp[i][j]`已经计算过,那么直接返回`dp[i][j]`的值。

   - 如果`i`等于`j`,那么`dp[i][j]`就等于`m * a[row][i]`,因为子数组只有一个元素,所以取数的得分就是`m * a[row][i]`。

   - 如果`i`不等于`j`,那么`dp[i][j]`就等于`f(i+1, j) + (m-j+i) * a[row][i]`和`f(i, j-1) + (m-j+i) * a[row][j]`中的较大值。这是因为,我们可以选择取第i个元素或者第j个元素,所以我们需要比较这两种选择的得分,取较大的那个。

4. 对于每一行,`f(0, m-1)`就是这一行的最大得分。程序将所有行的最大得分累加起来,就得到了总的最大得分。

这个程序的时间复杂度是O(n*m^2),因为它需要对每一行遍历所有可能的子数组。如果矩阵的大小非常大,那么这个程序可能会运行得比较慢。

注意,这个程序假设输入的矩阵的行数和列数不超过80,如果实际问题中矩阵的行数或列数可能超过这个值,那么需要相应地调整数组的大小。

代码实现2
#include <iostream>
#include <cstring>
using namespace std;int dp[85][85];
int a[85][85];
int n,m,row;int f(int i,int j){if(dp[i][j]){return dp[i][j];}if(i==j){return dp[i][j]=a[row][i]*m;}else{return dp[i][j]=max(f(i+1,j)+(m-j+i)*a[row][i],f(i,j-1)+(m-j+i)*a[row][j]);}
}int main() {cin>>n>>m;int ans=0;for(int i=0;i<n;i++)for(int j=0;j<m;j++){cin>>a[i][j];}for(row=0;row<n;row++){memset(dp,0,sizeof(dp));ans+=f(0,m-1);}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink反压如何查看和优化

我们在使用Flink程序进行流式数据处理时&#xff0c;由于种种原因难免会遇到性能问题&#xff0c;如我们在使用Flink程序消费kafka数据&#xff0c;可能会遇到kafka数据有堆积的情况&#xff0c;并且随着时间的推移&#xff0c;数据堆积越来越多&#xff0c;这就表名消费处理数…

mysql在where中判断订单支付时间大于几号时,加上一个条件,否则不加条件

可以使用MySQL的DATE函数来提取订单支付时间中的日期&#xff0c;然后在WHERE子句中进行比较。以下是示例代码&#xff1a; SELECT * FROM orders WHERE IF(DATE(payment_time) > 2021-07-01, order_status paid, TRUE)上述代码中&#xff0c;IF函数用于在支付时间大于202…

工作中遇到的英文问题(遇到就更新)

12.13 1.基数怎么写 odd 2.偶数怎么写 even 3.基准怎么写 benchmark "bench" 是一个英语词汇&#xff0c;可以指长凳、工作台或实验台的意思&#xff0c;具体取决于上下文。 4.比例怎么写 ratio 5.是不是2的n次方 isPowerOfTwo 6.得到2的n次方 n这个数 即求…

.NET中的并行集合

作为.NET 4并行扩展的一部分&#xff0c;新的System.Collections.Concurrent命名空间中包含一些新的集合。它们被设计为在含有较少锁的多线程并发操作时是安全的。该命名空间下还包含三个用于对并发操作的集合进行分区的类&#xff0c;但在此我们不讨论它们。 1. IProducerCon…

机器学习---Boosting

1. Boosting算法 Boosting思想源于三个臭皮匠&#xff0c;胜过诸葛亮。找到许多粗略的经验法则比找到一个单一的、高度预 测的规则要容易得多&#xff0c;也更有效。 预测明天是晴是雨&#xff1f;传统观念&#xff1a;依赖于专家系统&#xff08;A perfect Expert) 以“人无…

【flink番外篇】3、flink的source(内置、mysql、kafka、redis、clickhouse)介绍及示例(5)- clickhouse

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

软考 系统架构设计师系列知识点之大数据(2)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据&#xff08;1&#xff09; 所属章节&#xff1a; 第11章. 未来信息综合技术 第6节. 云计算和大数据技术概述 大数据和云计算已成为IT领域的两种主流技术。“数据是重要资产”这一概念已成为大家的共识&#xf…

云基础软件深化合作,云轴科技ZStack与麒麟软件战略签约

12月8日&#xff0c;云轴科技ZStack与麒麟软件战略合作签约仪式在北京举行&#xff0c;双方对过往紧密合作表达了充分肯定&#xff0c;并就进一步联合技术创新、打造重点行业标杆和持续赋能客户达成高度共识。云轴科技创始人&CEO张鑫和麒麟软件高级副总经理谢文征共同见证双…

Oracle(2-17) RMAN Maintenance

文章目录 一、基础知识1、Retention Policy 保留政策2、Recovery Window - Part 1 恢复窗口-第1部分3、Cross Checking 交叉检查4、The CROSSCHECK Command CROSSCHECK命令5、OBSOLETE VS EXPIRED 过时与过期6、Deleting Backups and Copies 删除备份和副本7、The DELETE Comma…

无参RCE [GXYCTF2019]禁止套娃1

打开题目 毫无思绪&#xff0c;先用御剑扫描一下 只能扫出index.php 我们尝试能不能用php伪协议读取flag php://filter/readconvert.base64-encode/resourceindex.php php://filter/readconvert.base64-encode/resourceflag.php 但是页面都回显了429 怀疑是不是源码泄露 用…

【Linux学习】深入理解动态库与静态库

目录 十三.动态库与静态库 13.1 认识动静态库 13.2 深入理解动静态库 什么是库? 编译链接过程 动静态库的基本原理 13.3 静态库 静态库的打包: 静态库的使用: 13.4 动态库 动态库的打包: 动态库的使用: 13.5 动态库与静态库怎么选? 十三.动态库与静态库 13.1 认识动静态库 …

【毕业设计】基于STM32的解魔方机器人

1、方案设计 1.采用舵机作为魔方机器人的驱动电机&#xff0c;从舵机的驱动原理可知&#xff1a;舵机运行的速度和控制器的主频没有关系&#xff0c;所以采用单片机和采用更高主频的嵌入式处理器相比在控制效果上没有什么差别。单片机编程过程简单&#xff0c;非常容易上手&am…

uniapp使用u-empty以及其相关属性

Uni-app 是一款基于 Vue.js 的跨平台开发框架&#xff0c;可以用于同时开发多个平台的应用程序。其中&#xff0c;u-empty 是 Uni-app 提供的一个组件&#xff0c;用于展示空状态的页面。 u-empty 组件有以下几个相关属性&#xff1a; image&#xff1a;设置空状态显示的图片。…

orb-slam2学习总结

目录 视觉SLAM 1、地图初始化 2、ORB_SLAM地图初始化流程 3、ORB特征提取及匹配 1、对极几何 2、对极约束 &#xff08;epipolar constraint&#xff09; 3、基础矩阵F、本质矩阵E 5、单目尺度不确定性 6、单应矩阵&#xff08;Homography Matrix&#xff09; 6.1 什么是单应矩…

Python入门第5篇(爬虫相关)

目录 爬虫初步说明 html相关基础 urllib之读取网页内容 http相关基础 requests之webapi调用 爬虫初步说明 爬虫&#xff0c;一句话来说&#xff0c;即模拟浏览器爬取一些内容&#xff0c;如自动下载音乐、电影、图片这种的 具体可能是直接访问网页进行解析&#xff0c;也…

【Spark精讲】RDD特性之数据本地化

首选运行位置 上图红框为RDD的特性五&#xff1a;每个RDD的每个分区都有一组首选运行位置&#xff0c;用于标识RDD的这个分区数据最好能够在哪台主机上运行。通过RDD的首选运行位置可以让RDD的某个分区的计算任务直接在指定的主机上运行&#xff0c;从而实现了移动计算而不是移…

【matlab进阶学习-6】 读取log数据data.txt文件,并做处理,导出报告/表格/图表

原始文件 原始文件格式txt&#xff0c;每一行对应一个数据&#xff0c;数据之间由逗号分割开 对应意思 时刻&#xff0c;电压&#xff0c;电流&#xff0c;功率&#xff0c;容量&#xff0c;&#xff0c;电流&#xff0c;功率&#xff0c;&#xff0c;RTC时间&#xff0c;状态…

内网服务器部署maven私服简记

前言 很多企业希望创建自己的maven私服&#xff0c;但服务器无法和外网连通&#xff0c;所以这里介绍一套完整的内网部署nexus的解决方案。实现的方式也很简单&#xff0c;将下载好的nexus安装和项目所需的依赖仓库都上传到服务i去上去&#xff0c;通过脚本的方式实现批量导入…

MySQL和 Oracle查看表信息

在日常Mysql和Oracle数据库使用时&#xff0c;经常使用到查看表、索引等信息&#xff0c;记录下来&#xff0c;方便备查。 MySQL 主要是使用 information_schema 信息表&#xff1b; Oracle 主要是使用 各种视图&#xff0c;如user_ind_columns。 一、查看所有表 MySQL查看表…

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…