文章目录
核心思路
位置i的最大分数,是由(i-j位置的最大分数和i-j位置向后走j步到达i位置分数的和)与位置i的最大分数比较得到的最大值。
动态规划算法设计流程
dp起点:位置0处的最大分数是socre【0】
状态转移方程:第i个位置的最大分数为当前位置的最大分数与(i-j位置的最大分数与i-j位置向后走j位置后到达i位置的分数的和)的最大值
for循环:从位置1开始循环,确保状态转移方程从dp起点开始执行。
代码细节
import java.util.Enumeration;
import java.util.Scanner;
public class Main {
public static void best(int[] dp,int len,int k,int[] score){
for (int i = 1; i <len; i++) {//从第二个位置开始算最大分数
for (int j = 1; j <=k; j++) {
dp[i]=Math.max(dp[i],dp[Math.max(0,i-j)]+score[i]);//第i个位置的最大分数为当前位置的最大分数与(i-j位置的最大分数与i-j位置向后走j位置后到达i位置的分数的和)的最大值
}
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int n= scanner.nextInt();
scanner.nextLine();
String str= scanner.nextLine();
int k= scanner.nextInt();
String[] strNum=str.split(" ");
int[] score=new int[strNum.length];
for (int i = 0; i < strNum.length; i++) {
score[i]=Integer.parseInt(strNum[i]);
}
int num= score.length;
int[] dp=new int[num];
dp[0]=score[0];//初始化dp起点
best(dp,num,k,score);
System.out.println(dp[num-1]);
}
}