算法笔记_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位数.其中的星号(*)代表任意的数字,可以相同,也可以不同, ...
随机推荐
- 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]
题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...
- cookies和session区别
session原理:1.session是保存在服务器端,理论上是没有是没有限制,只要你的内存够大 2.浏览器第一次访问服务器时会创建一个session对象并返回一个JSESSIONID=ID的值, ...
- python之并发编程(线程\进程\协程)
一.进程和线程 1.进程 假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源.是 ...
- Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
题面 Bzoj 洛谷 题解 这种求比值最大就是\(0/1\)分数规划的一般模型. 这里用二分法来求解最大比值,接着考虑如何\(check\),这里很明显可以想到用树形背包\(check\),但是时间复 ...
- 从Linux下载文件到Windows没有换行问题
这是一个小问题,一般用txt打开文件才会遇到,word打开也是正常(估计其他编程软件打开也正常). 顺便提一下pscp从Linux上下载文件到Windows. C:\Users\xuefei>p ...
- 【插头dp】CDOJ1690 这是一道比CCCC简单题难的简单题
最裸的插头dp,可参见大白书. #include<cstdio> #include<cstring> using namespace std; #define MOD 1000 ...
- Problem F: 零起点学算法42——多组测试数据输出II
#include<stdio.h> int main() { ; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { ...
- [转]mybatis 的简单使用
需要用到的包:(这里只是其中一个版本,其他的百度) mysql-connector-java-5.1.6-bin mybatis-3.2.2 先看项目目录: 配置文件mybatisconfig.x ...
- [转]XML中元素(Element)与节点(Node)的区别
前言: element是特殊的node 一段纯文本即text-node也是node 但不是element w3c的原话是 A node can be an element node, an attri ...
- iOS 日志管理异常捕获组件LFLogManager
一.功能 1.分级打印保存 解决一大堆重要.不重要打印信息在控制台混为一团的尴尬局面.可设置仅打印某级别及以上的信息.分为5类打印: DDLogError(@"打印并保存特别重要信息&quo ...