• 硬币收集问题


    问题描述:

     在一个mxn的矩阵中A,每个举证单元存放着一定数量(A(i,j)>=0)的硬币,假设有一个小机器人,它从举证的左上角A(0,0)开始,每经过一个单元格就收集其中的所有硬币,并且只能向右走或者往下走,问它从左上角一直到右下角A(m,n),能够收集最多的硬币是多少?

    例如,以2x3的简单矩阵为例:

    小机器人如果按照路径:(0,0)->(0,1)->(1,1)->(1,2)的路径走的话,可以收集到最多的硬币数:21。

    分析:

    由于该问题对每一步所走路径的方向有确定的限制:只能是向右走或者是向下走,实际上寻找其递推式是很简单的。

    实现:

    package agdp;
    public class CollectionCoins {
        private static int[][] initData(int m,int n){
            int[][] ary = new int[m][n];
            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    ary[i][j] = (int)(Math.random()*10);//随机生成[0,10]的整数
                }
            }
            return ary;
        } 
        public static int getMostCoins(int[][] ary){
            int m = ary.length,n = ary[0].length;
            int[][] aux = new int[m+1][n+1];//aux第0行和第0列均置0,充当哨兵作用
            for (int i = 1; i < m+1; i++) {
                for (int j = 1; j < n+1; j++) {
                    //递推式
                    aux[i][j] = Math.max(aux[i-1][j], aux[i][j-1])+ary[i-1][j-1];
                }
            }
            return aux[m][n];
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int m = 3,n = 4;
            int[][] ary = initData(m,n);
    //        for (int i = 0; i < m; i++) {
    //            for (int j = 0; j < n; j++) {
    //                System.out.print(ary[i][j]+"-");
    //            }
    //            System.out.println();
    //        }
            int result = getMostCoins(ary);
            System.out.print(result);
        }
    }
  • 相关阅读:
    第二周作业
    第一次作业
    第0次作业
    第一次的作业
    第0次作业
    第三次作业
    %f使用时的注意事项
    关于c++停止工作
    第二次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/qcblog/p/7784627.html
Copyright © 2020-2023  润新知