• 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]+"	");
                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    
    
  • 相关阅读:
    【提权思路】绕过SecureRDP限制远程连接
    用Win32编写发送消息至Notepad++的程序
    证明自己吧--------Writeup
    【漏洞预警】Intel爆CPU设计问题,导致win和Linux内核重设计(附测试poc)
    在Kali Linux上编译Windows EXP
    apt-get出现无法定位安装包问题解决
    利用Pastezort渗透win7
    利用arpspoof探取账户密码
    Argument 'xxx' is not a function, got undefined,初学Angular的第一个坑
    (转)Http协议经典详解
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13078391.html
Copyright © 2020-2023  润新知