问题描述:
一个二维数组每个位置放有若干苹果,你只能从左上角收集苹果到右下角。每次只能向右或者向下收集,输出能够收集到的最大苹果数量。
输入:
两个数字,表示二维数组长宽 M * N
接下来的M 行每行有N个数字,表示该位置的苹果数
输出:
能够收集到的最大苹果数量
终于能比较独立的顺利的解决动态规划问题了。
该问题状态: dp[i][j] 从起点到 二维坐标 input[i][j] 最多能获得的苹果数量
状态转移方程:dp[i][j]=input[i][j]+max(dp[i-1][j],dp[i][j-1]) if(i>0&&j>0)
那么就可以直接敲出代码
package com.luo.daily;
import java.util.Scanner;
import com.luo.util.SortUtils;
public class PingGuo {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
while(in.hasNextInt()){
int M=in.nextInt();
int N=in.nextInt();
int[][] input=new int[M][N];
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
input[i][j]=in.nextInt();
}
}
int[][] dp=new int[M][N];
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
if(i==0&&j==0)
dp[i][j]=input[i][j];
else if(i==0&&j>0)
dp[i][j]=input[i][j]+dp[i][j-1];
else if(i>0&&j==0)
dp[i][j]=input[i][j]+dp[i-1][j];
else
dp[i][j]=input[i][j]+Math.max(dp[i-1][j],dp[i][j-1]);
}
}
System.out.println("能得到的最大苹果数量是:"+dp[M-1][N-1]);
SortUtils.printArray(dp);
}
}
}