动态规划
- 如何确定本题可以使用动态规划来解的?
只关注状态的值,而不需要关注状态是如何转移过来的话。 - 如何确定本题的状态定义?
虽然大多数情况都是猜的,但也不是毫无规律,相当一部分题目的状态定义是与「结尾」或「答案」有所关联的。 - 如何确定状态转移方程?
如果我们的状态定义猜对了,状态转移方程就是对「最后一步的分情况讨论」 - 对状态转移的要求是什么?
如果是求最值的话,我们只需要确保「不漏」即可,因为重复不影响结果。
如果是求方案数的话,我们需要确保「不重不漏」。 - 如何分析动态规划的时间复杂度?
有多少个状态,复杂度/计算量就是多少。
N人过河问题
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n+1];
Arrays.sort(nums);
for (int i = 1; i <= n; i++) {
nums[i] = sc.nextInt();
}
int result = 0;
int stay = n;
while(stay > 3){
if(nums[1] + nums[stay-1] > 2*nums[2]) {
result += 2*nums[2] + nums[stay] + nums[1];
} else {
result += 2*nums[1] + nums[stay] + nums[stay-1];
}
stay -= 2;
}
if (stay == 3){
result += (nums[1] + nums[2] + nums[3]);
} else {
result += (nums[2]);
}
System.out.println("最短时间: " + result);
}
DFS
- 设计好递归函数的「入参」和「出参」
- 设置好递归函数的出口(Base Case)
- 编写「最小单元」处理逻辑
记忆化搜索