动态规划入门学习
本文根据bilibili动态规划视频整理而来
动态规划题目特点
1.计数
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m28TKBAz-1623755627520)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422210446872.png)]](https://i-blog.csdnimg.cn/blog_migrate/0a2f4870900a9ef783caf62f64ee42ea.png)
2.求最值
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdrvhZUP-1623755627521)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422210433090.png)]](https://i-blog.csdnimg.cn/blog_migrate/2858ecc029a0cf80790b6ce26faf6541.png)
3.存在性问题(是否、01、yes no)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VrRUHmLO-1623755627523)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422210556140.png)]](https://i-blog.csdnimg.cn/blog_migrate/2d6e56e92f9b960ab1e85f0f4061b394.png)
例题讲解一
问题描述
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eZ1PF2d6-1623755627525)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422211237421.png)]](https://i-blog.csdnimg.cn/blog_migrate/930eacd7e78e7f1c519ed0e035274bc9.png)
思考过程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cYCHb9wy-1623755627525)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422211254034.png)]](https://i-blog.csdnimg.cn/blog_migrate/b50acf6dff9ca7c61a1b6d1af1a5b653.png)

最优的策略,最后一个去掉后,剩下的也要是最优,也就是求子问题的最优
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-37uXGvr4-1623755627527)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422211608382.png)]](https://i-blog.csdnimg.cn/blog_migrate/1e808339fbf174d104f85c22323801cb.png)
通过i找最优的子问题的解的问题,都可以用动态规划去解
最终可以得到下面的式子
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHDUaIcu-1623755627527)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422211953798.png)]](https://i-blog.csdnimg.cn/blog_migrate/a9d85d161301fd7b1834eeb8e7e454e3.png)
解法
递归解法
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kkbaWnic-1623755627528)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422212228643.png)]](https://i-blog.csdnimg.cn/blog_migrate/2b407cb68056ca82b1a86f4e012e17c7.png)
存在的问题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WWBAefgk-1623755627529)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422212503311.png)]](https://i-blog.csdnimg.cn/blog_migrate/f5d27442a8e4ec10bc4d69a2d56dd0de.png)
重复的计算较多,最终的复杂度大大增加,最严重的问题是会超时,我们需要一个会将结果保存下来的算法
动态规划解法
转移方程
一般在面试的时候写出转移方程,那解题过程就会显得更加完美
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xM8ZvCzy-1623755627530)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422212814406.png)]](https://i-blog.csdnimg.cn/blog_migrate/2534b894d6a32b81b4b237bfddf45662.png)
初始条件和边界情况
但是我们仍然要考虑两个重要的组成部分:初始条件和边界情况
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtB1h246-1623755627531)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422213409049.png)]](https://i-blog.csdnimg.cn/blog_migrate/212677ca22cd8ae36dc25bc8c2ab9d79.png)
注意:初始条件有时候是不需要的,如果转移方程算不出来的但是有需要的定义,那就是作初始条件
其实初始条件就是最小的值,边界情况就是不要数组越界(正负越界)
计算顺序
大部分动规问题可以从小到大计算(即子问题先于父问题求解),其实就是求解一个数组的每一个值
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4DDCdg32-1623755627531)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422213907532.png)]](https://i-blog.csdnimg.cn/blog_migrate/cf04975d2cc1a64d8cc1a751ec15e7bb.png)
程序
public class Solution {
//{2,5,7} //27
public static int coinChange(int[] A, int M){
//首先在不浪费空间的基础上开辟空间
int[] f = new int[M + 1];
int n = A.length;
f[0] = 0;
int i,j;
// f[1], f[2],......,f[27]
for (i = 1; i <= M; ++i){
f[i] = Integer.MAX_VALUE; //先暂定无穷大
//f[i] = min{f[i-A[0]]+1,......,f[i-A[n-1]]+1}
for (j = 0; j < n; ++j){ //对每一钟结果都算一遍
//避免i-A[i]是负数, 避免在计算机层面上越界
if (i >= A[j] && f[i - A[j]] != Integer.MAX_VALUE){
f[i] = Math.min(f[i - A[j]] + 1, f[i]);
}
}
}
//如果最后结果出不来,就返回-1
if (f[M] == Integer.MAX_VALUE){
f[M] = -1;
}
return f[M];
}
public static void main(String[] args) {
int[] A ={2, 5, 7};
int M = 27;
System.out.println(coinChange(A,M));
}
}
例题讲解二
问题描述:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AQIwCBZk-1623755627532)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422225546948.png)]](https://i-blog.csdnimg.cn/blog_migrate/9beb241c3465347797cd7afc0fa9fb3c.png)
解法
确定状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8pPCITfn-1623755627533)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422225616616.png)]](https://i-blog.csdnimg.cn/blog_migrate/27cf814bf036ea8b7e801ec42882bb47.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-huLeWims-1623755627533)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422225942002.png)]](https://i-blog.csdnimg.cn/blog_migrate/f55077c6b7fc97b98dd114104fccfbda.png)
注意,关于在算法中开辟空间维度的问题,题目的子问题要求解决多少个变量,就开几维
转移方程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CXeckgsH-1623755627534)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422230629343.png)]](https://i-blog.csdnimg.cn/blog_migrate/e486aba46c02f8dc6c99acd7fa2abc04.png)
初始条件和边界情况
这道题地边界情况是对于某一维为0的情况来说的
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ioESEze-1623755627534)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422230756957.png)]](https://i-blog.csdnimg.cn/blog_migrate/20cc86f95a63efc21f8b2de8d9a0c41f.png)
注意边界情况f【i】【j】 = 1,因为在边界的时候,只有一个方向能过来,所以就赋值1,而其他的情况,就有两种可能,所以要把两种可能相加(这个时候就要注意题意了,是说有多少种可能,而不是要走过多少个格子)
计算顺序
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iBEagjKe-1623755627535)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210422230934959.png)]](https://i-blog.csdnimg.cn/blog_migrate/7987109616a362ce5dababb416d24fac.png)
程序
public class Solution2 {
public static int uniquePaths(int m, int n){
int[][] f = new int[m][n]; // 注意这里就不像上一题要+1
int i,j;
for (i = 0; i < m; ++i){ // row: top to bottom
for (j = 0; j < n; ++j){ // column: left to right
if (i == 0 || j == 0){
f[i][j] = 1;
} else {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
}
return f[m - 1][n - 1];
}
public static void main(String[] args) {
System.out.println(uniquePaths(7, 3));
}
}
例题讲解三
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t16OVGdd-1623755627535)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210425233828255.png)]](https://i-blog.csdnimg.cn/blog_migrate/2b3dace4260dd71ca78196cfa4c0e268.png)
解法
确定状态
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tinvQrqA-1623755627535)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210425234038968.png)]](https://i-blog.csdnimg.cn/blog_migrate/e436f0dcdce02f0b8b4564784dbd29e2.png)
找到子问题
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fod18ITn-1623755627536)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210425234132413.png)]](https://i-blog.csdnimg.cn/blog_migrate/8e11c798984237f2591bb16730755ac2.png)
转移方程
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6urM7k9E-1623755627536)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210425234237414.png)]](https://i-blog.csdnimg.cn/blog_migrate/aa12e542caf70e71f7d72eb63525389d.png)
上面的OR表示只要有一个i满足括号内的条件,那这个整体就为真
初始条件和边界情况
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TdzM1yhl-1623755627537)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210425234720395.png)]](https://i-blog.csdnimg.cn/blog_migrate/df5134cc10bab9cfd393d0ae084ae481.png)
这道题没有边界情况,因为枚举的i不会越界
计算顺序
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zx6xoFbk-1623755627538)(C:\Users\15998\AppData\Roaming\Typora\typora-user-images\image-20210426140936508.png)]](https://i-blog.csdnimg.cn/blog_migrate/c560ffd0a0c29c39ed696e92b112ddb9.png)
程序
public class Solution3 {
public static boolean canJump(int[] A){
int n = A.length;
boolean[] f = new boolean[n];
f[0] = true;
for (int j = 1; j < n; ++j){
f[j] = false;
//对已经求出来得f[i]遍历,直到满足条件确定可以跳到f[j]为止
for (int i = 0; i < j; ++i){
if (f[i] && i + A[i] >= j){
f[j] = true;
break;
}
}
}
return f[n-1];
}
public static void main(String[] args) {
int[] A = {2,3,1,1,4};
System.out.println(canJump(A));
}
}
本文深入解析动态规划算法,通过三个典型例题,包括找零钱问题、网格路径计数和跳跃游戏,详细阐述了动态规划的解题思路、转移方程、初始条件与边界情况的设定。每个例子都提供了完整的Java代码实现,帮助读者理解并掌握动态规划的实战技巧。
5760

被折叠的 条评论
为什么被折叠?



