传纸条 Codevs1169

  • 题目描述
  • 解题思路
  • C++代码
  • 算法分析

题目描述

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。
在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。
还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用0表示),可以用一个0-100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这两条路径上同学的好心程度只和最大。现在,请你帮助小渊和小轩找到这样的两条路径。

  • 数据规模和约定
      30%的数据满足:1<=m,n<=10
      100%的数据满足:1<=m,n<=50
  • 输入描述
    输入的第一行有2个用空格隔开的整数m和n,表示班里有m行n(1<=m,n<=50)
    接下来的m行是一个m*n的矩阵,矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度。每行的n个整数之间用空格隔开。
  • 输出描述
    输出共一行,包含一个整数,表示来回两条路上参与传递纸条的学生的好心程度之和的最大值。
  • 样例输入

3 3
0 3 9
2 8 5
5 7 0

  • 样例输出

34

解题思路

  • 题目分析
    在矩阵中找到两条不重复的从(1,1)到(m,n)路径,使得路径权值之和最大,且只可以向下或者向右移动。
  • 单条路径dp方程

d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i ] [ j − 1 ] ) + a r r [ i ] [ j ] ; dp[i][j] = max(dp[i-1][j], dp[i][j-1])+arr[i][j]; dp[i][j]=max(dp[i−1][j],dp[i][j−1])+arr[i][j];

  • 两条路径dp方程
    d p [ i ] [ j ] [ x ] [ y ] dp[i][j][x][y] dp[i][j][x][y]表示两条路径从起点到(i,j)和(x,y)的最大路径权值之和

d p [ i ] [ j ] [ x ] [ y ] = a r r [ i ] [ j ] + m a x ( d p [ i − 1 ] [ j ] [ x − 1 ] [ y ] , m a x ( d p [ i − 1 ] [ j ] [ x ] [ y − 1 ] , m a x ( d p [ i ] [ j − 1 ] [ x ] [ y − 1 ] , d p [ i ] [ j − 1 ] [ x − 1 ] [ y ] ) ) ) ; dp[i][j][x][y] = arr[i][j] + max(dp[i - 1][j][x - 1][y], max(dp[i - 1][j][x][y - 1], max(dp[i][j - 1][x][y - 1], dp[i][j - 1][x - 1][y]))); dp[i][j][x][y]=arr[i][j]+max(dp[i−1][j][x−1][y],max(dp[i−1][j][x][y−1],max(dp[i][j−1][x][y−1],dp[i][j−1][x−1][y])));
i f ( i ! = x ∣ ∣ j ! = y ) d p [ i ] [ j ] [ x ] [ y ] + = a r r [ x ] [ y ] ; if (i != x || j != y) \\ dp[i][j][x][y] += arr[x][y]; if(i!=x∣∣j!=y)dp[i][j][x][y]+=arr[x][y];

取dp[i - 1][j][x - 1][y]、dp[i - 1][j][x][y - 1]、dp[i][j - 1][x][y - 1]、 dp[i][j - 1][x - 1][y]中的最大值加上arr[i][j],若(i,j)和(x,y)不重复,则加上arr[x][y]。
特别考虑当两条路径在同一个点相遇时(i=x且j=y),为不合法路径,arr值只能加一次,且保证了不合法路径的转移状态dp[i][j][x][y]不会被后续max取到

C++代码

#include<bits/stdc++.h>
using namespace std;
int main() {int m, n;cin >> m >> n;vector<vector<int>>arr(m+1, vector<int>(n+1));for (int i = 1; i < m+1; i++){for (int j = 1; j < n+1; j++){cin >> arr[i][j];}}vector<vector<vector<vector<int>>>>dp(m + 1, vector<vector<vector<int>>>(n + 1, vector< vector<int>>(m + 1, vector<int>(n + 1, 0))));for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){for (int x = 1; x <= m; x++){for (int y = 1; y <= n; y++){dp[i][j][x][y] = arr[i][j] + max(dp[i - 1][j][x - 1][y], max(dp[i - 1][j][x][y - 1], max(dp[i][j - 1][x][y - 1], dp[i][j - 1][x - 1][y])));if (i != x || j != y)dp[i][j][x][y] += arr[x][y];}}}}cout << dp[m][n][m][n];return 0;
}
}

算法分析

时间复杂度: O ( n 2 m 2 ) O(n^2m^2) O(n2m2)

两条不重复的最大路径相关推荐

  1. 传统企业向产业互联网转型的两条路径

     亚信CTO金亚东:传统企业向产业互联网转型的两条路径 摘要:在亚信CTO金亚东看来,传统企业面向产业互联网转型有两条路径,第一个路径就是像鹰一样去构建平台,还有一种方式就是去enjoy 日前,在 ...

  2. php一条SQL语句mysql插入两条重复的数据

    今天晚上在做测试开发的时候,请求了一个最简单的Insert SQL 语句,数据库里竟然出现了两条数据!!! 经过反复的琢磨,觉着代码没有问题.做了很多的代码改动后依然不行. 通过这边文章我看到了一点思 ...

  3. 基于FPGA系统合成两条视频流实现3D视频效果

    目录 1.概述 2.时钟架构 3.带锁定视频解码器的同步系统 4.异步视频系统 4.1.时钟三态模式 4.2.两条视频流中的数据对齐误差 4.3.行锁定摄像机对齐误差 4.4.不同的连接长度 4.5. ...

  4. php执行mysql insert,当执行mysql insert 时插入两条是咋回事

    当执行mysql insert 时插入两条是怎么回事? 本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑 //做了一个手机上传图片到服务器的功能.但是 ...

  5. 值班问题:insert语句插入了两条数据?

    上周值班,碰到这样的一个客户问题,表结构简化如下: CREATE TABLE `aa` ( `c1` int(10) unsigned NOT NULL AUTO_INCREMENT, `c2` in ...

  6. 为什么老师批改完试卷,分数下要画两条横线?今天终于知道了!

    全世界只有3.14 % 的人关注了 爆炸吧知识 总有考试分数下画两条横线的习惯,原来是这样形成的! 为什么老师改卷之后 会在分数下画两条横线呢? 你要去问老师? 别问了,可能连老师都不知道-- 来看看 ...

  7. 两条线段的夹角 cesium_《原本》命题1.10 一条线段可以被分成两条相等的线段

    命题1.10 一条线段可以被分成两条相等的线段 设:AB为一条直线. 求作:平分为两条相等的线段. 作等边三角形ABC(命题1.1) 命题1.1已知一条线段可作一个等边三角形. 作∠ACB的角平分线C ...

  8. 两条信号之间加电容_信号完整性SI读书笔记之一

    微信公众号:硬核电子--一个只分享技术原创文的公众号. 本周项目较忙,没什么时间撰写文章.​但即使这样,本人也不愿意随便从网络上搬运一篇文章过来凑数,因此,就分享一下比较久以前整理的有关信号完整性的读 ...

  9. Revit 2011 二次开发之“取得两条直线的交点”

    Revit提供特殊的类和集合来完成这些操作,积累一下.     /// <summary>     /// Utility method for getting the intersect ...

最新文章

  1. 图表2------沪深300指数图+收盘价的EMD分量图+PCA后的特征累计贡献率表+预测模型评估指标公式表
  2. python从入门到精通视频(全60集)-【网盘下载】Python从入门到精通视频(全60集)...
  3. matlab 折线图_MATLAB作图实例:13:折线图和条形图的双轴图
  4. 分享WordPress博客搜索引擎优化的六点经验 博客园 cnbogs
  5. Vue的router导航重复-报错:Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to curren
  6. Smart View 11.1.2.5配置共享连接
  7. 舆情监控系统python开源_开源舆情监控系统
  8. 《精通linux设备驱动程序开发》——USB
  9. 节假日查询 麦谈帮API数据接口
  10. NetLimiter网速测试小坑
  11. linux下gbd调试基础
  12. 靠着游戏收入支撑打造众多口碑产品的网易,下一个20年会如何走
  13. 股票市场量化分析matlab,(特价书)MATLAB金融算法分析实战:基于机器学习的股票量化分析...
  14. 基于FPGA的LD3320语音识别模块驱动设计
  15. Linux计划任务、周期性任务执行
  16. EPLAN 3D图自动生成2D安装版图
  17. 关于Facebook发币,FB元老级员工们有话说
  18. 前端入门练习之将psd文件转换为HTML文件
  19. 商品交易系统产品介绍
  20. 【长期更新】盘一盘那些 uTools 高质量插件,让你的工作效率瞬间提升N倍!

热门文章

  1. java 计算两点之间的距离
  2. jquery parseJSON()方法解析json字符串
  3. 几种建立http-tunnel的方法
  4. 日常英语口语练习-情景交际场景25(四)
  5. 旅游行业会员营销制胜关键:培育客户忠诚度
  6. 什么广播域?什么是冲突域?冲突域和广播域的区别:
  7. git enter passphrase for key
  8. 递归---Hanoi塔问题
  9. 解决:Mysql 重装时 3306 端口被占用及如何释放 3306 端口的问题
  10. HCIA网工数通Datacom之网工初级(2)IP和OSPF配置