zoukankan      html  css  js  c++  java
  • 算法笔记_050:硬币收集问题(Java)

    目录

    1 问题描述

    2 解决方案

    2.1 动态规划法

     


    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]+"	");
                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]+"	");
                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 著  潘彦 译

     

  • 相关阅读:
    react:如何创建一个新项目
    python3-多重继承
    Stylus-富有表现力的、动态的、健壮的CSS
    使用@property
    python3-使用__slots__
    python:实例属性和类属性
    java_day1
    学习笔记144—SPSS 重复测量方差分析【方法二】
    学习笔记143—SPSS 重复测量的多因素方差分析
    学习笔记142—Matlab如何读取Excel和写入Excel??
  • 原文地址:https://www.cnblogs.com/liuzhen1995/p/6438765.html
Copyright © 2011-2022 走看看