题目描述

小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1(1,1),小轩坐在矩阵的右下角,坐标(m,n)(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸条只可以向上或者向左传递。

在活动进行中,小渊希望给小轩传递一张纸条,同时希望小轩给他回复。班里每个同学都可以帮他们传递,但只会帮他们一次,也就是说如果此人在小渊递给小轩纸条的时候帮忙,那么在小轩递给小渊的时候就不会再帮忙。反之亦然。

还有一件事情需要注意,全班每个同学愿意帮忙的好感度有高有低(注意:小渊和小轩的好心程度没有定义,输入时用00表示),可以用一个0-1000−100的自然数来表示,数越大表示越好心。小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条,即找到来回两条传递路径,使得这22条路径上同学的好心程度之和最大。现在,请你帮助小渊和小轩找到这样的22条路径。

输入输出格式

输入格式:

输入文件,第一行有22个用空格隔开的整数mm和nn,表示班里有mm行nn列。

接下来的mm行是一个m \times nm×n的矩阵,矩阵中第ii行jj列的整数表示坐在第ii行jj列的学生的好心程度。每行的nn个整数之间用空格隔开。

输出格式:

输出文件共一行,包含一个整数,表示来回22条路上参与传递纸条的学生的好心程度之和的最大值。

输入输出样例

输入样例#1: 复制

3 3

0 3 9

2 8 5

5 7 0

输出样例#1: 复制

34

说明

【限制】

30%的数据满足:1 \le m,n \le 101≤m,n≤10

100%的数据满足:1 \le m,n \le 501≤m,n≤50

NOIP 2008提高组第三题

思路讲解

本道题需用到的算法为动态规划。

  题目中提到在 m 行 n 列且带有权值的矩阵中从(1,1)到(m,n)找一条路径,

然后再从(m,n)到(1,1)找一条路径,这两天路径不能重复,即每个点只能两个人只能走一次,

且不可以回退,即第一条只能向下或向右,第二条只能向上或向左。

化简后可知:其实就是从(1,1)到(m,n)找两条路径,这两条路径只能向下或向右且不相交,

计算出这两条路径的权值和的最大值即可。

  所以很容易构想出动态规划方程:

  两个人走,利用四维的数组 dp[x1][y1][x2][y2] 来保存路径中间过程的权值之和的最大值,

其中 x1 y1 x2 y2 分别表示两个人的位置。

每个人现在的位置都有两种可能:从他的上边或左边;两个人组合就有四种可能,

因此:构造出动态规划方程(map[x][y] 表示权值,即好心程度):

dp[x1][y1][x2][y2]=max(dp[x1-1][y1][x2-1][y2],dp[x1][y1-1][x2-1][y2],

dp[x1][y1-1][x2][y2-1],dp[x1-1][y1][x2][y2-1])+map[x1][y1]+map[x2][y2];

  其中 x1,x2 的取值范围为从起点到终点,即 1 ~ m,y1,y2 的取值范围为起点到终点,即 1 ~ n。

  1. import java.util.Scanner;
  2. public class chuanzhitiao {
  3. static int[][] map;// 好心程度
  4. static int[][][][] dp;
  5. public static void main(String[] args) {
  6. Scanner sc = new Scanner(System.in);
  7. int m = sc.nextInt();
  8. int n = sc.nextInt();
  9. map = new int[52][52];
  10. dp = new int[52][52][52][52];
  11. for (int i = 1; i <= m; i++) {
  12. for (int j = 1; j <= n; j++) {
  13. map[i][j] = sc.nextInt();
  14. }
  15. }
  16. int sum = dp(m, n);
  17. System.out.println(sum);
  18. }
  19. static int dp(int m, int n) {
  20. for (int x1 = 1; x1 <= m; x1++) {
  21. for (int y1 = 1; y1 <= n; y1++) {
  22. for (int x2 = 1; x2 <= m; x2++) {
  23. for (int y2 = 1; y2 <= n; y2++) {
  24. /*
  25. *
  26. * 如果第一个人没有走到最后一行或最后一列,并且两个人没有重复
  27. * 因为走到最后一行或最后一列,容易造成第二个人无路可走的情况
  28. */
  29. if ((x1 < m || y1 < n) && x1 == x2 && y1 == y2) {
  30. continue;
  31. }
  32. dp[x1][y1][x2][y2] = Math.max(Math.max(
  33. dp[x1 - 1][y1][x2 - 1][y2],
  34. dp[x1 - 1][y1][x2][y2 - 1]), Math.max(
  35. dp[x1][y1 - 1][x2 - 1][y2],
  36. dp[x1][y1 - 1][x2][y2 - 1]))
  37. + map[x1][y1] + map[x2][y2];
  38. }
  39. }
  40. }
  41. }
  42. return dp[m][n][m][n];
  43. }
  44. }

Java实现 蓝桥杯 传纸条的更多相关文章

  1. 日期求星期(java)-蓝桥杯

    日期求星期问题(java)-蓝桥杯 1:基姆拉尔森计算公式(计算星期) 公式: int week = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7; 此处y,m,d指代年 ...

  2. Java实现 蓝桥杯VIP 基础练习 高精度加法

    java算法 蓝桥杯 高精度加法 问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数 ...

  3. java算法 蓝桥杯 乘法运算

    问题描述 编制一个乘法运算的程序. 从键盘读入2个100以内的正整数,进行乘法运算并以竖式输出. 输入格式 输入只有一行,是两个用空格隔开的数字,均在1~99之间(含1和99). 输出格式 输出为4行 ...

  4. java算法 蓝桥杯 扶老奶奶街

    一共有5个红领巾,编号分别为A.B.C.D.E,老奶奶被他们其中一个扶过了马路. 五个红领巾各自说话: A :我和E都没有扶老奶奶 B :老奶奶是被C和E其中一个扶过大街的 C :老奶奶是被我和D其中 ...

  5. java算法 蓝桥杯 高精度加法

    问题描述 在C/C++语言中,整型所能表示的范围一般为-231到231(大约21亿),即使long long型,一般也只能表示到-263到263.要想计算更加规模的数,就要用软件来扩展了,比如用数组或 ...

  6. java算法 蓝桥杯 格子位置

    问题描述 输入三个自然数N,i,j (1<=i<=N,1<=j<=N),输出在一个N*N格的棋盘中,与格子(i,j)同行.同列.同一对角线的所有格子的位置. 输入格式 输入共三 ...

  7. 日期类的使用(java)-蓝桥杯

    蓝桥杯日期问题常考,java提供了日期类很方便: //日历类 Calendar c = Calendar.getInstance(); // 获取实例化对象 Date date =c.getTime( ...

  8. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

  9. java算法 蓝桥杯 摆花

    问题描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

随机推荐

  1. Code::Blocks无法调试 Starting the debuggee failed: No executable specified, use `target exec'

    1.必须建立工程 2.工程名不可有特殊字符或空格,可以有字母.数字.下划线 2.编译器设置里勾选-g(产生调试符号) 3.重新编译项目(如果之前编译过了) 4.调试器设置 > Default & ...

  2. Day_09【常用API】扩展案例2_测试小字符串在大字符串中出现的次数

    分析以下需求,并用代码实现 1.键盘录入一个大字符串,再录入一个小字符串 2.统计小字符串在大字符串中出现的次数 3.代码运行打印格式: 请输入大字符串: woaiheima,heimabutongy ...

  3. springboot controller templates html

    首先声明: @Controller注解的类必须要在启动类的子集目录下,否则无法扫描 本文要求: 通过controller层跳转页面到html页面(本篇用到thymeleaf模板) 项目结构展示: 第一 ...

  4. HDU 2013 (水)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2013 题目大意:已知最后一天桃子只有一个,告诉你猴崽子第一天吃掉总桃子数的一半多一个,第二天吃掉剩下总 ...

  5. vue相关环境搭建一条龙

    前言 如题,基于很多朋友对于环境配置及搭建存在疑问或者不熟悉的情况,因此整理一篇完整的环境搭建说明,在此默认各位到手的电脑是需要从0开始配置环境.  nvm的安装 很多同学过去可能安装node都是直接 ...

  6. Linux相关命令、虚拟机网络配置

    虚拟机联网 Linux命令 1.查找 #查找django进程,不包括grep自建的 ps -ef |grep django | grep -v grep # find 查找home目录下的name.t ...

  7. 【雕爷学编程】Arduino动手做(52)---MicroSD卡读写模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种 的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准 ...

  8. nodejs上使用sql

    1.首先本地要安装mysql, https://www.mysql.com/downloads/. 2.在node中连接mysql,要安装mysql驱动,也就是npm安装mysql模块:npm i m ...

  9. 数据结构----双端队列Dque

    双端队列的概念与数据结构 deque(也称为双端队列)是与队列类似的项的有序集合.它有两个端部,首部和尾部,并且项在集合中保持不变. deque 特殊之处在于添加和删除项是非限制性的.可以在前面或后面 ...

  10. 基于vue+Django的简迩音乐用户界面实现

    应这次软件工程课程要求,我们团队着力打造一个音乐播放器软件. 软件实现主要采用基于Vue.js+Python Django,前后端分离架构实现网页. 用户界面主要功能:呈现用户收藏歌单歌曲信息,并且提 ...