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];
    };
    
    }
  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/duange/p/6021200.html
Copyright © 2011-2022 走看看