题目描述:
小明和朋友玩跳格子游戏, 有 n 个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择从任意格子起跳,但是不能跳连续的格子,不能回头跳,也不能超过一圈 ;
给定一个代表每个格子得分的非负整数数组,计算能够得到的最高分数。
输入描述:
给定一个数例,第一个格子和最后一个格子收尾相连,如:2 3 2
输出描述:
输出能够得到的最高分,如:3
补充说明:
1 <= nums.length <= 100
0 <= nums[i] <= 1000
收起
示例1
输入:
2 3 2
输出:
3
说明:
只能跳3这个格子,因为第一个格子和第三个格子收尾相连
示例2
输入:
1 2 3 1
输出:
4
说明:
1+3=4
public class 跳格子 {
public static int getMaxScore(int[] nums) {
int n = nums.length;
if (n == 0) {
return 0;
} else if (n == 1) {
return nums[0];
} else if (n == 2) {
int max = Math.max(nums[0], nums[1]);
System.out.println(max);
return max;
}
int[] dp1 = new int[n];
dp1[0] = 0;
dp1[1] = nums[1];
for (int i = 2; i < n; i++) {
dp1[i] = Math.max(dp1[i - 1], dp1[i - 2] + nums[i]);
}
int[] dp2 = new int[n];
dp2[0] = nums[0];
dp2[1] = Math.max(nums[0], nums[1]);
System.out.println(dp2[1]);
for (int i = 2; i < n - 1; i++) {
dp2[i] = Math.max(dp2[i - 1], dp2[i - 2] + nums[i]);
System.out.println("----2 ");
System.out.println("dp2[i - 1] = " + dp2[i - 1]);
System.out.println("dp2[i - 2 = " + dp2[i - 2]);
System.out.println("nums[i] = " + nums[i]);
System.out.println("dp2[i] = " + dp2[i]);
System.out.println("----");
}
int max = Math.max(dp1[n - 1], dp2[n - 2]);
return max;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入每个格子的分数(以空格分隔):");
String input = scanner.nextLine();
String[] numsStr = input.split(" ");
int[] nums = new int[numsStr.length];
for (int i = 0; i < numsStr.length; i++) {
nums[i] = Integer.parseInt(numsStr[i]);
}
int maxScore = getMaxScore(nums);
System.out.println(maxScore);
}
}