1 问题描述

在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格。每一步,机器人可以从当前的位置向右移动一格或向下移动一格。当机器人遇到一个有硬币的单元格时,就会将这枚硬币收集起来。设计一个算法找出机器人能找到的最大硬币数并给出相应的路径。

2 解决方案

2.1 动态规划法


本文编码思想参考自《算法设计与分析基础》第三版,具体如下:

package com.liuzhen.chapter8;

public class RobotCoinCollection {
//输出找到最大硬币数的路径
public void getMaxPath(int[][] A){
int rowA = A.length;
int columnA = A[0].length;
//在数组A最上面一行添加一行元素0,在最左边一列添加一列元素0
int[][] changeA = new int[rowA+1][columnA+1]; //初始化,各个元素均为0
int[][] maxA = new int[rowA+1][columnA+1]; //用于计算从A[0][0]到达各元素位置收集到的最大硬币数
for(int i = 0;i < rowA;i++){
for(int j = 0;j < columnA;j++)
changeA[i+1][j+1] = A[i][j];
}
for(int i = 1;i <= rowA;i++){
for(int j = 1; j <= columnA;j++){
if(maxA[i-1][j] >= maxA[i][j-1])
maxA[i][j] = maxA[i-1][j] + changeA[i][j];
else
maxA[i][j] = maxA[i][j-1] + changeA[i][j];
}
} //输出各个元素位置收集到的最大硬币数
System.out.println("各个元素位置收集到的最大硬币数:");
for(int i = 1;i <= rowA;i++){
for(int j = 1;j <= columnA;j++)
System.out.print(maxA[i][j]+"\t");
System.out.println();
} System.out.println("从左上方到右下方收集到最大硬币数的路径(PS:其中元素为-1 表示行走路径):");
maxA[1][1] = 1; //最左上方位置
maxA[rowA][columnA] = -1; //最右下方位置
int maxI = rowA;
int maxJ = columnA;
while(maxI >= 1 && maxJ >= 1){
if(maxA[maxI][maxJ-1] >= maxA[maxI-1][maxJ]){
maxA[maxI][maxJ-1] = -1;
maxJ = maxJ - 1;
}
else{
maxA[maxI-1][maxJ] = -1;
maxI = maxI - 1;
}
} for(int i = 1;i <= rowA;i++){
for(int j = 1;j <= columnA;j++)
System.out.print(maxA[i][j]+"\t");
System.out.println();
} } public static void main(String[] args){
RobotCoinCollection test = new RobotCoinCollection();
int[][] A ={{0,0,0,0,1,0},
{0,1,0,1,0,0},
{0,0,0,1,0,1},
{0,0,1,0,0,1},
{1,0,0,0,1,0}};
test.getMaxPath(A);
}
}

运行结果:

各个元素位置收集到的最大硬币数:
0 0 0 0 1 1
0 1 1 2 2 2
0 1 1 3 3 4
0 1 2 3 3 5
1 1 2 3 4 5
从左上方到右下方收集到最大硬币数的路径(PS:其中元素为-1 表示行走路径):
-1 0 0 0 1 1
-1 -1 -1 -1 2 2
0 1 1 -1 -1 -1
0 1 2 3 3 -1
1 1 2 3 4 -1

Java实现硬币收集问题的更多相关文章

  1. 算法笔记_050:硬币收集问题(Java)

    目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 在n*m格木板中放有一些硬币,每格的硬币数目最多为一个,在木板左上方的一个机器人需要收集尽可能多的硬币并把它们带到右下方的单元格 ...

  2. JAVA 年老代收集器 第10节

    JAVA 年老代收集器 第10节 上一章我们讲了新生代的收集器,那么这一章我们要讲的就是关于老年代的一些收集器.老年代的存活的一般是大对象以及生命很顽强的对象,因此新生代的复制算法很明显不能适应该区域 ...

  3. JAVA 年轻代收集器 第九节

    JAVA 年轻代收集器  第九节 继续上一章所讲的,STW即GC时候的停顿时间,他会暂停我们程序中的所有线程.如果STW所用的时间长而且次数多的话,那么我们整个系统稳定性以及可用性将大大降低. 因此我 ...

  4. 经典Java面试题收集

    1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注这些 ...

  5. JAVA分代收集机制详解

    Java堆中是JVM管理的最大一块内存空间.主要存放对象实例. 在JAVA中堆被分为两块区域:新生代(young).老年代(old). 堆大小=新生代+老年代:(新生代占堆空间的1/3.老年代占堆空间 ...

  6. Java面试题收集以及参考答案(100道)

    不积跬步无以至千里,这里会不断收集和更新Java基础相关的面试题,目前已收集100题. 1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Cl ...

  7. Java数组操作方法收集(快速判断某个值在这个数组中)

    Java数组操作最高效的方式是循环取值,如果转换成集合那么就会分配内存,效率不如前者,但是方法多,需要在性能调优上去权衡.切记:数组是数组,集合是集合. 下面是收集最常用的数组转成集合的操作方法: i ...

  8. java jar包收集

    activation~与javaMail有关的jar包,使用javaMail时应与mail.jar (mail.jar和activation.jar)一起加入到lib中去,具体负责mail的数据源和类 ...

  9. Java面试题收集学习整理1

    1.java序列化.反序列化及serialVersionUID作用 ."=="和equals方法究竟有什么区别? .静态变量和实例变量的区别? 在语法定义上的区别:.Integer ...

随机推荐

  1. [hdu5348]图上找环,删环

    http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给一个无向图,现在要将其变成有向图,使得每一个顶点的|出度-入度|<=1 思路:分为两步,(1 ...

  2. linux(ubuntu) 1045, "Access denied for user 'root'@'localhost' (using password: YES)"

    问题现象: 最近使用 flask 的 sqlalchemy 框架,在链接数据库(mysql)时出现报错 sqlalchemy.exc.OperationalError: (pymysql.err.Op ...

  3. zip压缩文件(二)

    普通压缩文件以20M大小的文件为例 public static void main(String[] args) { String source = "F:\\demo\\择天记 第5季 第 ...

  4. Office 2016 英文版(VOL版)下载

    Office 2016 英文版(大客户版)下载磁力链接: 1.专业版(含project.visio) ProPlus, Project Pro, Visio Pro (x86-x64) magnet: ...

  5. node的stream

    stream在Unix系统中是个标准的概念. In computer programming, standard streams are preconnected input and output c ...

  6. HTML标签和属性二

    五.文本标记 7.文本样式 <b></b>  <strong></strong> 加粗 <i></i>   <em> ...

  7. uwsgi模块以参数形式运行项目

    1.虚拟环境中下载uwsgi模块-------pip install uwsgi 2.脚本运行案例 新建一个test.py脚本文件,写入如下内容: def application(env, start ...

  8. ionic + asp.net core webapi + keycloak实现前后端用户认证和自动生成客户端代码

    概述 本文使用ionic/angular开发网页前台,asp.net core webapi开发restful service,使用keycloak保护前台页面和后台服务,并且利用open api自动 ...

  9. MySQL 5.7 基于GTID创建运行主库的从库-xtrabackup+mysqldump

    一.GTID innobackupex备份实现主从同步 1)master备份 innobackupex --defaults-file=/etc/my.cnf --user=root --passwo ...

  10. MySQL(5)— 常用函数

    五.MySQL常用函数 可参考[官网文档]https://dev.mysql.com/doc/refman/8.0/en/ 5-1.基本函数 数学运算: -- 数学运算 SELECT ABS(-8) ...