算法笔记_050:硬币收集问题(Java)
目录
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
参考资料:
1.《算法设计与分析基础》 第3版 Anany Levitin 著 潘彦 译
算法笔记_050:硬币收集问题(Java)的更多相关文章
- 算法笔记_023:拓扑排序(Java)
目录 1 问题描述 2 解决方案 2.1 基于减治法实现 2.2 基于深度优先查找实现 1 问题描述 给定一个有向图,求取此图的拓扑排序序列. 那么,何为拓扑排序? 定义:将有向图中的顶点以线性方式进 ...
- 算法笔记_228:信用卡号校验(Java)
目录 1 问题描述 2 解决方案 1 问题描述 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心,因为并不是一个随便的信用卡号码都是合法的,它必须通过Luhn算法来验证 ...
- 算法笔记_138:稳定婚姻问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为稳定婚姻问题? 有一个男士的集合Y = {m1,m2,m3...,mn}和一个女士的计划X = {n1,n2,n3,...,nn}.每一个男士有 ...
- 算法笔记_137:二分图的最大匹配(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为二分图的最大匹配问题? 引用自百度百科: 首先得说明一下何为匹配: 给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于 ...
- 算法笔记_132:最大流量问题(Java)
目录 1 问题描述 2 解决方案 1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...
- 算法笔记_040:二进制幂(Java)
目录 1 问题描述 2 解决方案 2.1 从左至右二进制幂 2.2 从右至左二进制幂 1 问题描述 使用n的二进制表示,计算a的n次方. 2 解决方案 2.1 从左至右二进制幂 此方法计算a的n次 ...
- 算法笔记_014:合并排序(Java)
1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...
- 算法笔记_233:二阶魔方旋转(Java)
目录 1 问题描述 2 解决方案 1 问题描述 魔方可以对它的6个面自由旋转. 我们来操作一个2阶魔方(如图1所示): 为了描述方便,我们为它建立了坐标系. 各个面的初始状态如下:x轴正向:绿x轴 ...
- 算法笔记_227:填写乘法算式(Java)
目录 1 问题描述 2 解决方案 1 问题描述 观察下面的算式: * * × * * = * * * 它表示:两个两位数字相乘,结果是3位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...
随机推荐
- go chapter 5 - 异常处理 error、panic、recover
https://blog.csdn.net/tennysonsky/article/details/78946265 error(不中断).panic(中断).recover(拦截中断 类似于 ca ...
- UTF-8 与 BIG-5 转码
BIG-5 轉 UTF-8 若要將一個文字檔從 BIG-5 編碼轉換為 UTF-8 編碼,可以執行: iconv -f BIG-5 -t UTF-8 big5.txt > utf8.txt 其中 ...
- apache配置httpd.conf相关
1.apache开启压缩AddOutputFilterByType 找到并打开apache/conf目录中的httpd.conf文件 在httpd.conf中打开deflate_Module,head ...
- poj 1127(直线相交+并查集)
Jack Straws Description In the game of Jack Straws, a number of plastic or wooden "straws" ...
- 【模拟】Flo's Restaurant
[poj2424]Flo's Restaurant Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2960 Accept ...
- django邮件相关设置
EMAIL_HOST = 'smtp.mxhichina.com' # 阿里云企业邮箱 EMAIL_HOST_PORT = 25 # 邮箱服务器端口 EMAIL_HOST_USER = '****** ...
- OpenLayers2中的事件_以Popup为例
SATURDAY, 21 MARCH 1-Preface 前几天阅读学习了OpenLayers'Cookbook中的第四章——Working with events. 从AFDS系统的开发项目进行至今 ...
- Android ANR优化 2
在实际情况中,当Android项目的用户量特别大时候,一些细小的问题也会被放大,ANR问题就是一个典型的例子. 一些ANR问题只会发生在用户实际使用的情景,当系统资源比较紧张等一些特殊情况下才会遇到, ...
- Android内存优化12 内存泄漏常见情况3 注册泄漏
android 中有很多注册和反注册,由于在注册后,上下文自身会被持久化的观察者列表所持有,如果不进行反注册,就会造成内存泄漏 内存泄漏1:Sensor Manager 代码如下: MainActiv ...
- Delphi XE8 TStyleBook的使用
Delphi XE8来了,FMX的性能有了巨大的提升,比如:XE7下ListBox上下滑动的卡顿已经不复存在,直接用xe8编译后,再上下划动ListBox,已经变的非常流畅.另外,也见到有网友说,通过 ...