zoukankan      html  css  js  c++  java
  • 硬币收集问题--动态规划3

       在n*m的格子中的某些格子放置一个硬币,即有的格子有硬币,有的格子没有硬币。

    一个机器人只能向下或向右移动来收集金币,从格子的左上角出发,移动到右下角,

    求可以收集的最多金币个数

    动态规划 

    f(0,j)=0;f(i,0)=0;1<=j<=m,1<=i<=n;

    f(i,j)=max{f(i-1,j),f(i,j-1)+a[i][j]}

    完整代码如下

    import java.util.Scanner;
    public class Jin_bin_shou_ji {
    public static void main(String[] args) {
      Scanner sc=new Scanner(System.in);
      int m,n;
      System.out.print("输入数组的行数n:");
      n=sc.nextInt();
      System.out.print("输入数组的列数m:");
      m=sc.nextInt();
      System.out.println("输入数组(n行m列)的值,0代表空,1代表一个金币。");
      int a[][]=new int[n+1][m+1];
      for(int i=1;i<=n;++i)
       for(int j=1;j<=m;++j)
          a[i][j]=sc.nextInt();
      sc.close();
      int b=ge_shu(a);
      System.out.println("收集金币的最多个数为:"+b);
    };
    public static int ge_shu(int[][] a){
        int n=a.length,m=a[0].length; /*注意数组的第一个元素为0,要过滤掉*/
        int f[][]=new int[n][m];
        f[1][1]=a[1][1];
        /*核心代码*/
        for(int j=2;j<m;++j)  /*初始化第一行*/
            f[1][j]=f[1][j-1]+a[1][j];
        
        for(int i=2;i<n;++i)   /*核心算法*/
        {
           f[i][1]=f[i-1][1]+a[i][1];
           for(int j=2;j<m;++j)
             f[i][j]=Math.max(f[i-1][j], f[i][j-1])+a[i][j];
        }
        return f[n-1][m-1];
    };
    
    }
  • 相关阅读:
    ABP 往前端返回详细的错误信息
    ABP 报错1
    three.js 测试1
    three.js 添加 图形控制界面 gui
    three.js 设置透明度
    three.js 基础使用1
    three.js 添加环境光
    three.js 添加三维坐标系
    P2690 接苹果
    [USACO08FEB]修路Making the Grade
  • 原文地址:https://www.cnblogs.com/duange/p/6021200.html
Copyright © 2011-2022 走看看