目录
动态规划
- 1.确定dp数组以及下标的含义
wi[i]代表牛牛能吃到多少斤草
ai[i]代表牛牛能走到哪隔吃草
定义dp[i]为牛牛当前最多能吃到多少斤草
- 2.确定递推公式
dp[i] = Math.max(dp[i],dp[i]+temp);
temp是之前能走到dp[i]的最大值
- 3.dp数组如何初始化
初始化dp,将草地的斤数赋值给dp,因为牛牛可以从任何一块地开始
for(int i = 0;i < n ; i++){
dp[i] = wi[i];
}
- 4.确定遍历顺序
从题目可知,牛牛向右走的距离必须是ai的整数倍,所以遍历顺序从左到右
- 5.举例推导dp数组
代码实现
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] wi = new int[n];
int[] ai = new int[n];
//定义dp数组
int[] dp = new int[n];
for(int i = 0;i < n ; i++){
wi[i] = in.nextInt();
}
for(int i = 0;i < n ; i++){
ai[i] = in.nextInt();
}
//初始化dp,将草地的斤数赋值给do,因为牛牛可以从任何一块地开始
for(int i = 0;i < n ; i++){
dp[i] = wi[i];
}
for(int i = 0;i<n;i++){
int temp = 0;
for(int j = 0;j<i;j++){
//向右走的距离必须是ai的整数倍
if((i-j) % ai[j] == 0){
temp = Math.max(dp[j],temp);
}
}
dp[i] = Math.max(dp[i],dp[i]+temp);
}
//答案不一定是在dp[n-1],可能是在中央
int result = 0;
for(int v : dp){
result = Math.max(result,v);
}
System.out.println(result);
}
}