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