C++---数字三角形模型---传纸条(每日一道算法2023.2.26)

news2024/11/26 18:20:55

注意事项:
本题dp思路与 “线性dp–方格取数” 一致,下方思路仅证明为什么使用方格取数的思路是正确的。

题目:
小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。

一次素质拓展活动中,班上同学安排坐成一个 m
行 n 列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。
幸运的是,他们可以通过传纸条来进行交流。

纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标 (1,1),小轩坐在矩阵的右下角,坐标 (m,n)。
从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。 
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。

班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙,反之亦然。 
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用 0表示),可以用一个 0∼100的自然数来表示,数越大表示越好心。

小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度之和最大。
现在,请你帮助小渊和小轩找到这样的两条路径。

输入格式
第一行有 2个用空格隔开的整数 m和 n,表示学生矩阵有 m行n列。
接下来的 m行是一个 m×n的矩阵,矩阵中第 i行 j列的整数表示坐在第 i行 j列的学生的好心程度,每行的 n个整数之间用空格隔开。

输出格式
输出一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。

数据范围
1≤n,m≤50

输入:
3 3
0 3 9
2 8 5
5 7 0
输出:
34
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

const int N = 55;
int w[N][N], f[N+N][N][N];		//注意k要开两倍,因为是i+j的总和
int n, m;

int main()
{
    cin >> n >> m;
    n = max(n, m);	//这里n使用较大的做为边界即可,因为多算几个0不影响结果
		
    for (int i = 1; i<=n; i++)
        for (int j = 1; j<=m; j++) cin >> w[i][j];
	
	//线性dp
    for (int k = 2; k<=n+m; k++) {
        for (int i1 = 1; i1<=n; i1++) {
            for (int i2 = 1; i2<=n; i2++) {
            	// k = i1+j1 = i2+j2, 切记是相等关系
                int j1 = k-i1, j2 = k-i2;
                if (j1>=1 && j2>=1 && j1<=n && j2<=n) {	 //判断j1和j2的合法性
                	//如果是重叠点就只加一次,例如(1,2)(1,2), 如果是非重叠点就将两个点都加上,例如(1, 2)(2, 1)
                    int t = w[i1][j1];
                    if (i1 != i2) t += w[i2][j2];
                    
                    //引用节省代码量,分四种情况讨论上两个点如何进行移动
                    int &x = f[k][i1][i2];
                    x = max(x, f[k-1][i1-1][i2-1]);		//down,down
                    x = max(x, f[k-1][i1-1][i2]);		//down,right
                    x = max(x, f[k-1][i1][i2-1]);		//right,down
                    x = max(x, f[k-1][i1][i2]);			//right, right
                    x += t;
                }
            }
        }
    }

    cout << f[n+m][n][n];
    return 0;
}

思路:
这里直接贴vlehr大佬的画图解释(原链接):
已经讲的非常清晰了,自认讲不明白,就借用下大佬的吧哎嘿~
请添加图片描述
声明:
算法思路来源为y总,详细请见https://www.acwing.com/
本文仅用作学习记录和交流

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

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

相关文章

安卓开发调试使用 Charles抓包Https请求

1、Windows电脑安装证书Help->SSL Proxying -> Install Charles Root Certificate2、手机安装证书证书保存到电脑上.crt结尾的文件Help->SSL Proxying -> Save Charles Root Certificate2.复制到手机上 3.安装证书以红米手机为例打开手机设置-->密码与安全-->…

php宝塔搭建部署实战多模板cms管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的多模板cms管理系统源码。感兴趣的朋友可以自行下载学习。 技术架构 PHP7.0 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#xff0c;宝塔添加一…

在软件开发中如何将看板方法与 Scrum 集合使用?

什么是看板和 Scrum 的混合模式&#xff1f;适合在哪些场景使用&#xff1f;有哪些成功的案例可参考&#xff1f;本文将围绕以上问题展开。敏捷实践是一个团队过程&#xff0c;选择适合团队的敏捷框架时并没有什么技巧&#xff0c;无论您是使用看板方法、Scrum 还是两者的组合&…

【C++】vector的模拟实现(SGI版本)

吃不了自律的苦&#xff0c;又接受不了平庸的罪。想让自己变好&#xff0c;但又想舒服些。 你啊你……要么就不要去想&#xff0c;想了又不去做&#xff0c;犹犹豫豫&#xff0c;徘徊不前&#xff0c;患得患失… 文章目录一、四种构造函数1.vector的框架和无参构造2.构造函数调…

为什么FPGA在深度学习领域有着得天独厚的优势?

01 FPGA在深度学习领域有哪些优势 FPGA&#xff08;Field-Programmable Gate Array&#xff09;是一种灵活的可编程硬件设备&#xff0c;它在深度学习应用领域中具有许多优势。 首先&#xff0c;FPGA具有非常高的并行性。在深度学习中&#xff0c;许多计算都可以并行化&…

Verilog实现组合逻辑电路

在verilog 中可以实现的数字电路主要分为两类----组合逻辑电路和时序逻辑电路。组合逻辑电路比较简单&#xff0c;仅由基本逻辑门组成---如与门、或门和非门等。当电路的输入发生变化时&#xff0c;输出几乎&#xff08;信号在电路中传递时会有一小段延迟&#xff09;立即就发生…

sqlserver数据库备份策略及实战测试

文章目录启动SQL SERVER 代理服务配置完整备份差异备份和事务日志备份备份还原测试测试云端备份最近研究sqlserver数据库备份&#xff0c;这里吧测试过程总结分享&#xff01;sqlserver日志备份主要分为三种 &#xff1a;全量备份、差异备份、事务日志备份。全量备份&#xff1…

大话数据结构-线性表

1 定义 线性表是零个或多个数据元素的有限序列。 2 抽象数据类型 ADT 线性表(List)Data&#xff1a;线性表的数据对象集合为{al,a2,a3,....an}&#xff0c;每个元素的类型均为DataType。其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素&…

锁屏面试题百日百刷-Hive篇(八)

锁屏面试题百日百刷&#xff0c;每个工作日坚持更新面试题。锁屏面试题app、小程序现已上线&#xff0c;官网地址&#xff1a;https://www.demosoftware.cn。已收录了每日更新的面试题的所有内容&#xff0c;还包含特色的解锁屏幕复习面试题、每日编程题目邮件推送等功能。让你…

gitblit 安装使用

1 安装服务端 简而言之&#xff1a;需要安装 java&#xff0c;gitblit&#xff0c; git 三个软件 Windows 10环境使用Gitblit搭建局域网Git服务器 前言 安装Java并配置环境安装gitblit并配置启动gitblit为windows服务使用gitblit创建repository并管理用户 1.1 安装Java并配…

[Java·算法·中等]LeetCode215. 数组中的第K个最大元素

每天一题&#xff0c;防止痴呆题目示例分析思路1题解1分析思路2题解2分析思路3题解3&#x1f449;️ 力扣原文 题目 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不…

REFL: 联邦学习中智能的设备选择方法

原创 齐天宇 隐私计算研习社 收录于合集#联邦学习54个现有的FL方案使用随机的参与者选择来提高选择过程的公平性&#xff0c;但是这会导致资源的低效利用和较低的训练质量。本文系统地解决了FL中资源效率低效的问题&#xff0c;展示了智能参与者选择和合并来自落后参与者的更新…

React-高阶组件

认识高级组件 高阶函数的维基百科定义:至少满足以下条件之一 1、接受一个或多个函数作为输入; 2、输出一个函数; JavaScript中比较常见的 filter、map、reduce 都是高阶函数 那么说明是高阶组件呢? 高阶组件的英文是 Higher-Order Components&#xff0c;简称为 HOC;官方的…

2023年如何通过软考初级程序员?

初级的考试难度不大&#xff0c;稍微有点编程基础&#xff0c;认真备考应该没什么大问题。 先清楚大纲&#xff1a; 高效备考&#xff01;理清考点&#xff0c;针对性复习 科目一&#xff1a;综合知识 75道单项选择题&#xff0c;1题1分&#xff0c;时长150分钟&#xff1b;…

Qt 防止程序退出

文章目录摘要QWidgetQML方法 1方法 2关键字&#xff1a; Qt、 eventFilter、 Close、 键盘、 任务管理器摘要 今天要聊得内容还是怎么防止别人关闭我的程序&#xff0c;之前都是在win下面&#xff0c;一般都是用过钩子连捕获键盘事件&#xff0c;完了吧对应的事件忽略&#x…

面了 6 家大厂,并拿下 5 家 offer,进大厂好像也没有那么困难吧....

前言 二月份的时候因为换工作的缘故&#xff0c;陆续参加了华为、蚂蚁、字节跳动、PDD、百度、Paypal 的社招面试&#xff0c;除了字节跳动流程较长&#xff0c;我主动结束面试以外&#xff0c;其他的都顺利拿到了 Offer。 最近时间稍微宽裕点了&#xff0c;写个面经&#xf…

1.测试用例

一、测试用例怎么写 用例编号&#xff0c;用例标题&#xff0c;模块/项目&#xff0c;前置条件&#xff0c;优先级&#xff0c;测试步骤&#xff0c;测试数据&#xff0c;预期结果&#xff0c;实际结果。 案例&#xff1a;微信登陆测试点 1.登录成功 2.密码错误&#xff0c;登…

安卓性能测试+结果可视化

使用到的技术&#xff1a;mobileperfpyecharts或mobileperfgrafana 性能测试 GitHub - alibaba/mobileperf: Android performance testAndroid performance test. Contribute to alibaba/mobileperf development by creating an account on GitHub.https://github.com/alibab…

Linux: ARM GIC仅中断CPU 0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI中断的CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5…

KT404C语音芯片串口发数据没反应或者报错的处理总结

一、问题简介 KT404C我焊接到PCB板上面&#xff0c;直接使用串口调试助手发指令没有任何返回&#xff0c;请问是什么意思呢&#xff1f; 很确定&#xff0c;串口也没连错&#xff0c;使用的是CH340G的USB转TTL &#xff0c;【TX连接KT404C的7脚RX】 【RX连接KT404C的8脚TX】 二…