动态规划的基本思想
动态规划解题的时候将问题分解为几个不同的阶段(把原始问题分解为不同的子问题),自底向上计算。每次决策都依赖于当前的状态。我们可以将不同阶段的不同状态存储在一个二维数组中。
从这个二维数组中,可以查到到任何一个状态的最优结果。
例题
题目描述:
在一个N层高的金字塔上,以金字塔顶为第一层,第i层有i个落点,每个落点有若干枚金币,在落点可以跳向左斜向下或向右斜向下的落点。若知道金字塔的层数N及每层的金币数量分布,请计算小招在本次游戏中可以获得的最多金币数量。
输入描述:
输入共有N + 1行(N ≤ 1024),第一行为高度N,第二行至N + 1行 ,为该金字塔的金币数量分布。
输出描述:
输出金币数量。
示例:
代码实现
1、先把键盘输入组装成一个二维数组;
2、然后通过动态规划思想解题。
import java.util.Scanner;
public class test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
scan.nextLine();
int[][] arr = new int[N][N];
for (int i = 0; i < N; i++) {
int j;
for (j = 0; j <= i; j++) {
arr[i][j] = scan.nextInt();
}
while (j <= N - 1) {
arr[i][j] = 0;
j++;
}
scan.nextLine();
}
maxSumNew(arr);
}
private static int maxSumNew(int[][] arr) {
int n=arr.length;
if (arr == null) {
return 0;
}
for (int i = n - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
if (i == n - 1) {
arr[n - 1][j] = arr[n - 1][j];
} else {
arr[i][j] = Math.max(arr[i + 1][j], arr[i + 1][j + 1]) + arr[i][j];
}
}
}
System.out.println(arr[0][0]);
return arr[0][0];
}
}