硬币收集问题--动态规划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];
};

}

 

posted @ 2016-11-01 22:03  静若飘絮  阅读(1362)  评论(0编辑  收藏  举报