动态规划
这是B站上,动态规划第一讲的一道题目,由于无法评论,就把代码发表在这里。
package com.study.dynamicprogroming;
/**
* @date 2020/7/26
* @description B站 动态规划(一)
*
* 一天工作11个小时,怎么做任务在能赚最多的钱,一共有 8 个任务,中间的数字是每项任务 挣的钱
* 任务1: |———5----|
* 任务2: |--1--|
* 任务3:|--------8--------|
* 任务4: |----4---|
* 任务5: |-------6---- --|
* 任务6: |-----3-----|
* 任务7: |------2----|
* 任务8: |----4-----|
* 时间: 0 1 2 3 4 5 6 7 8 9 10 11
*
*/
public class Demo1 {
public static void main(String[] args) {
int[] values = {5, 1, 8, 4, 6, 3, 2, 4};
//递归算法调用
int recursionOpt = recursionOpt(8, values);
System.out.println(recursionOpt);
int dpOpt = dpOpt(values);
System.out.println(dpOpt);
}
/**
* 递归求最优解
*/
public static int recursionOpt(int task, int[] values) {
if (task == 0) return 0;
int maxSalaries = Math.max(recursionOpt(task - 1, values), recursionOpt(prev(task), values) + values[task-1]);
return maxSalaries;
}
/**
* 确定要做该任务后,其上一个可做的任务
*/
public static int prev(int task) {
if (task == 8) return 5;
if (task == 7) return 3;
if (task == 6) return 2;
if (task == 5) return 0;
if (task == 4) return 1;
if (task == 3) return 0;
if (task == 2) return 0;
if (task == 1) return 0;
return 0;
}
/**
* 动态规划求 最优解
* 思路: 将每次计算的最优解 都放在一个数组里面,for循环代替了提柜。
*/
public static int dpOpt(int[] values) {
int[] opts = new int[values.length + 1];
opts[0] = 0;
opts[1] = 5;
for (int i = 2; i <= values.length; i++) {
opts[i] = Math.max(opts[i - 1], values[i-1] + opts[prev(i)]);
}
return opts[values.length];
}
}